概述
参考文献为《C++ Primer 5th》
1.默认构造函数(P236)
默认构造函数:类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数。
默认构造函数无须任何实参。合成默认构造函数:编译器在发现类中不包含任何构造函数的情况下才会替我们生成一个默认构造函数。
所以在我们定义了构造函数的时候,如果需要有默认的构造方式,就必须手动定义默认构造函数。
2.普通构造函数(P237-238、P258)
我在这里定义的普通构造函数的范围就是除了默认构造函数和拷贝构造函数以外的构造函数。
通常应该使用构造函数初始值表,来进行初始化。当然也可以在函数体里面进行赋值。
3.拷贝构造函数(P440)
拷贝构造函数:如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数就是拷贝构造函数。
注:一般拷贝初始化都是调用拷贝构造函数,不管是使用Class a(b) 还是 Class a = b
都是调用的拷贝构造函数。
合成拷贝构造函数:如果没有为一个类定义拷贝构造函数,编译器就会自己定义一个。
注:合成拷贝构造函数的缺点:
(1)只能拷贝非static成员。
(2)执行的是浅拷贝而不是深拷贝。拷贝的对象如果是拥有自己的资源(比如动态分配内存),也会拷贝一份的话
就是深拷贝,否则就是浅拷贝。
4.拷贝赋值运算符
即重载oprator=,作为类的一个成员函数。
这个成员函数只能用来赋值,不能用来拷贝初始化。因为拷贝初始化时还没有一个完整的对象,没有一个完整的对象就无法调用成员函数。
为了验证class a = b这样的语句到底是调用的拷贝构造函数,还是重载的拷贝赋值函数。
我们可以跑如下的代码,代码中我在拷贝构造函数与重载的拷贝赋值函数的函数体里面让它们输出自己的一句话来验证。
#include <iostream>
using namespace std;
class Test
{
public:
Test() = default; //默认构造函数
Test(int a, int b): a(a), b(b) {} //一般构造函数
Test(const Test &orig): a(orig.a), b(orig.b) {cout << "调用的是拷贝构造函数" << endl;} //拷贝构造函数
Test& operator=(const Test &); //重载拷贝赋值操作符,其具体实现在类外。
private:
int a = 0;
int b = 1;
};
Test&
Test::operator=(const Test &rhs)
{
a = rhs.a;
b = rhs.b;
cout << "调用的是拷贝赋值操作符重载" << endl;
return *this;
};
int main()
{
cout << "this is Test t1:" <<endl;
Test t1;
cout << "this is Test t2(4, 5):" <<endl;
Test t2(4, 5);
cout << "this is Test t3(t2):" <<endl;
Test t3(t2);
cout << "this is Test t4 = t2:" <<endl;
Test t4 = t2;
cout << "this is t1 = t2:" << endl;
t1 = t4;
return 0;
}
运行结果如图:
最后
以上就是清秀白开水为你收集整理的《C++ Primer 5th》读书笔记3---关于类的构造函数的全部内容,希望文章能够帮你解决《C++ Primer 5th》读书笔记3---关于类的构造函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复