C++ 构造函数
来源:互联网 发布:colorpicker mac 编辑:程序博客网 时间:2024/06/16 07:30
这篇博客将会介绍以下几个方面的内容
(会有遗漏,而且是初学者,可能表述不准确或者错误)
(本博客不权威,但是有自己的理解,如果有谁有不理解的地方或者发现错误 可以评论)
一c++中构造函数的定义:
二c++中构造函数的分类:
三c++中构造函数使用形式:
四构造函数何时调用,自动调用?手动调用?自动调用何种形式的构造函数?
一:构造函数的定义
构造函数 ,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
1.1构造函数的功能:
为对象分配空间;
对数据成员赋初值;
请求其他资源。
1.2构造函数的特点:
1与类同名 2 无返回值 3构造函数可以有重载。 4分配内存时会自动调用(这句话必须深刻理解)或者手动调用指定的构造函数(涉及何种情况下调用何种构造函数)
深刻理清第四个特点其实构造函数就没有问题了。
二:构造函数的分类
1.普通构造函数:有两个或两个以上参数的构造函数
2.默认构造函数
3.复制(拷贝)构造函数
4.类型转换构造函数
三构造函数的使用形式
class Employee{
public:
Employee(); //默认构造函数的形式 //未写任何构造函数下 则系统自动分配这个构造函数。 可以自己编写
Employee(char *n); //普通构造函数
// Employee(Employee &emp); //这是拷贝构造函数的声明形式 //未写拷贝构造函数下 则系统自动分配这个拷贝构造函数。 可以自己编写
~Employee();
int age; //其实数据做成公用的并不合适,这个只是为了做样子
private:
char *name;
};
Employee::Employee(){ //如果未自己写其他构造函数(本例子中已经写了下面的构造函数,所以要写),这个函数可以不写,系统会默认分配一个空参数构造函数。
//当然如果没有采用空参数的构造函数生成的实例对象,本函数还是可以不写。但是本例子中有Employee tm1这个会调用;
}
Employee::Employee(char *n){
name = new char[strlen(n)+1];
strcpy(name,n);
}
int len=strlen(emp.name);
name=new char[len+1];
strcpy(name,emp.name);
}
Employee::void copy_test1(Employee &tmp){ //自己所写的普通函数,将对构造函数有更进一部的认识。顺便带复习下& 引用传值。
age=tmp.age;
}
Employee::void copy_test2(Employee tmp){ //自己所写的普通函数,与上个函数的区别仅仅在于 &
age=tmp.age;
}
int main(){
Employee tm1; //此时内存中已经有分配这快空间,所以自动调用默认构造函数Employee::Employee()
Employee emp1(“zhang”); //内存分配空间。 调用Employee::Employee(char *n)构造函数
//调用拷贝构造函数的几种形式:
Employee emp2(emp1); //在没有重写拷贝构造函数的情况下 会 调用系统 自动分配的拷贝构造函数 //本例子已经重写
//Employee emp2=emp1; //同上:调用 拷贝构造函数 //系统自动分配的拷贝构造函数 对于指针成员变量的拷贝会出现 的连体问题。建 议//自己重写
tm1.copytest1(emp1); //这个函数并没有什么特别的。
tm1.copytest2(emp1); //这个函数首先会调用一个拷贝构造函数。将copytest2这个函数的形参实例化,也就是在copytest2的程序代码段前 复制一个emp1的副本,调 //用的是 拷贝构造函数。。。。。。。。。。。反正在内存中生成一个对象,也就是分配空间,必须调用构造函数。。 至于调用何种构造函数,由其调用的形式决定。。。这里的形式是进入其他函数,生成一个副本。
return 0;
}
//拷贝构造函数说明(也就是下面所说的复制构造函数)
如果类中没有说明复制构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员
浅复制和深复制
浅)复制:将对象数据成员的值进行简单的复制(最好利用系统自动生成的复制构造函数,已完成浅复制(系统自动生成的复制构造函数是浅赋值。发现复制后的类 与 被复制的对象 指针类型的成员 所指向的一样。也就是指针变量里面的地址一样,free掉一个,对另外一个的内容也会造成破坏。。。。两个对象实际上在指针类型上是连体婴儿,而不是有独立的部分。)
深复制:不仅将对象数据成员的值进行复制,而且对指针型数据成员生成新空间,然后复制对应的值。(自己写的函数最好写成深拷贝,其实看意愿,担任我们肯定不希望指针部分连体)
- 【C++】拷贝构造函数
- C#:静态构造函数
- C++:拷贝构造函数
- explicit构造函数(C++)
- C++:关于构造函数
- C++-构造函数
- C++String构造函数
- c++-转换构造函数
- c++"拷贝构造函数
- C++: 拷贝构造函数
- object-c 构造函数
- C#构造函数
- objective-c 构造函数
- 【C++】构造函数
- 【C++】explicit构造函数
- 【C++】拷贝构造函数
- C++: 复制构造函数
- C++: 移动构造函数
- vs2010打开c#工程时 -- 无法打开项目文件“***.csproj”,因为此版本不支持该项目类型
- tomcat负载1W并发的配置【!!!我没有测试过】
- 不依赖于Web容器也可以自己创建JNDI
- 页面滑动3:使用Fragment实现页面滑动(对应页面的文字颜色变化)
- 《乔布斯传》最后一章:真实的我
- C++ 构造函数
- github - 下载某个git库的4种方法
- 最大连续子数组和
- SQL Server 何时将“脏页”回写到硬盘
- ios生成随机数方法
- 检测该进程是否存在?
- 12 个有效的提高编程技能的方法
- 数据绑定(Data Binding)
- SQL SERVER 中partition用法之一