C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
来源:互联网 发布:51黑单片机论坛 编辑:程序博客网 时间:2024/05/16 08:30
这是我转载的,为了自己看方便,原创在这里http://blog.csdn.net/guiyinzhou/article/details/6320362
构造函数中的这三个概念对于我这个初学者是需要时间和耐性去好好体会理解的。
对于默认构造函数,大家的第一印象好像总是认为这样的,例如有一个类A
class A{
public:
A():a(0),b(2.09) {}
private:
int a ;
double b;
string str;
};
好像总以为默认构造函数都是形参表中没有形参的那种。但事实上还有一种默认构造函数他是有形参的,只不过其中的形参都带有默认实参。
如
class A{
public:
A(int c=0, double d=4.6):a(c),b(d) {}
private:
int a ;
double b;
string str;
};
这也是一个默认构造函数。默认构造函数可以自己定义,也可以靠编译器来合成。但是两者在应用中还是有不同用途的。
合成的默认构造函数初始化数据成员的原则是初始化变量的原则,即:类类型的数据成员通过调用其相应类的默认构造函数初始化,内置和复合类型的数据成员根据其定义的位置决定,在全局作用于定义的对象时才进行初始化,在局部作用于中定义的对象不作初始化,因此我们可以看到,当你的数据成员中含有内置类型或者复合类型时,最好自己定义一个默认构造函数,不要依靠编译器合成,那样会带来不必要的麻烦和限制了类的应用。自己定义的一个默认构造函数对内置类型和复合类型数据成员做初始化。还要注意,如果你定义了一个构造函数,不管是普通的还是默认的构造函数,编译器都不会在为你合成默认构造函数了。
隐式类类型转化
注意,在C++的类中,用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。注意条件:“单个实参调用”
此处在实践中好像很混乱,请教了很多人好像此处的规定与不同版本的编译器有关,不是太专业,就不水了。抑制隐式转换可以使用explicit关键字。
复制构造函数
复制构造函数是一种特殊的构造函数,它有单个形参,而且该形参是对该类类型本身的引用。
复制构造函数主要有以下几种用处:
1.根据同一个类型的对象显式或隐式的初始化另一个对象;
2.复制一个对象,用于传递实参;
3.函数返回一个类对象的时候;
4.初始化顺序容器中的元素;
5.根据元素初始化列表初始化数组元素。
复制构造函数的工作原理是:先使用指定的构造函数创建一个临时对象,然后调用复制构造函数将创建的临时对象复制到正在创建的对象上
如果不想用户代码复制该类类型的对象,应将复制构造函数显式声明为private
还有一个问题
为什么拷贝构造函数必须为引用传递,不能是值传递?
见下面这篇博客,个人认为回答的很好!!!!
http://www.cnblogs.com/chio/archive/2007/09/14/893299.html
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- 默认构造函数,隐式类型转换,复制构造函数
- 默认构造函数和默认复制构造函数
- C++: 复制构造函数
- 构造函数 复制构造函数
- 类型转换构造函数
- 类型转换构造函数
- 类型转换构造函数
- 类型转换构造函数
- 浅析构造函数之默认构造函数
- 学习复制构造函数
- 复制构造函数学习
- 构造函数 复制构造函数 类型转换构造函数 析构函数
- 构造函数、复制构造函数、类型转换构造函数、析构函数
- 默认构造函数和拷贝构造函数
- 默认构造函数和拷贝构造函数
- list,map,set互转
- 解决Sublime Text 2中文显示乱码问题
- java读写文件中文乱码问题
- oracle截取字段内容
- 设置wifi及gprs
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- ubuntu12下安装的php5.3
- HashSet,TreeSet和LinkedHashSet的区别
- python 打开网页方法
- JS的数据类型:number,string,boolean,null,undefined,object,function
- AutoCompleteTextView实现邮箱自动填充
- Graphical_Layout 不显示自定义控件 解决方法
- HP-unix支持大于2G的文件的配置方法
- 怎样让 dma_alloc_coherent() 可以申请更大的内存