20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
2017-01-11 17:25
316 查看
构造函数&赋值函数&拷贝构造函数&学习方式
1:但凡有一个新的对象产生,100%就需要调用构造函数或者拷贝构造函数。2:如果直接将类或者函数写在.h文件中,相当于把他做成了inline函数(与编译器有关)。一般.h文件只做声明。
3:ClassDemo demo1 = demo;//这个不是赋值函数,而是拷贝构造函数。
ClassDemo&operator=(const ClassDemo& other)//这个是直接类对象=数字或者demo = demo1的时候调用,是赋值函数
ClassDemo(const ClassDemo& other)//编译器默认生成了这个。直接进行拷贝。这个函数叫拷贝构造函数(有新对象产生)。eg:ClassDemo other = demo; 这个就直接调用拷贝构造函数,直接other = demo只是赋值函数。与other = 1是一样的,只不过这个先是隐式转换了。同理ClassDemo other = 1;也是先隐式转换调用了转换构造函数,没有调用拷贝构造函数。
上面这个是类之间相等的时候调用。参数一定是个引用。这个函数必须就是这样,不能修改,也不能写成ClassDemo(const ClassDemo other)//这会无限递归。因为函数传递的形参实参化的时候会有复制过程,又会调用这个函数。
ClassDemo demo1(10);//调用构造函数 ClassDemo demo2 = 20;//隐式转换再调用构造函数 ClassDemo demo3 = demo1;//调用拷贝构造函数 demo2 = demo1;//调用operator= demo1 = 20;//隐式转换生成临时对象后调用operator=,然后析构临时对象4:一个空的类目前学习的有默认的四个函数:构造。析构,赋值函数,拷贝构造函数
5:如果类里面的参数是指针,构造里面就只能在函数里面拷贝了,不能直接初始化列表,因为初始化列表是浅拷贝,直接两个指针相等,需要自己做深拷贝。那么const的指针怎么初始化呢,实际上只能在函数里面new空间,同时等于这个数。不能使用初始化列表,初始化列表正对指针会出错。
ClassDemo::ClassDemo(unsigned int len) { _len = new unsigned int(len); std::cout << "ClassDemo()被调用" << _str << std::endl; }
以上是类函数的构造函数
#include <iostream> #include "ClassDemo.h" int main() { using namespace std; unsigned int num = 10; ClassDemo *demo1 = new ClassDemo(num); num = 20; cout << demo1->getLen() << endl;//正常输出10,如果用的初始化列表传递地址就会出错 delete demo1; return 0; }
6:默认的赋值构造函数和默认的拷贝构造函数不能赋值指针。字符串等,否则原来对象里面有的指针就会变成野指针,所以这个时候就需要自己写这两个函数,不能再使用默认的了。
7:debug下0xCCCCCCCC为为初始化的值,0xDDDDDDDD为已经被deletd的值(仅限VS编译器下)(后者不会100%这样)。
默认的拷贝构造和赋值构造函数中只是直接赋值,包括指针。直接对指针拷贝称为浅拷贝,存在风险,可能被其他地方delete,没有维护生命周期。strcpy等这种才叫深拷贝,这才是安全的,可以维护所有参数的生命周期。
#if() #elif() #else #endif条件编译(看里面的条件是否成立),#ifdef #ifndef #define(如果有定义/无定义执行,多用于防止二次编译)。
相关文章推荐
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/
- 20170101C++阶段班03_Object C++_05运算符重载
- 20161230C++阶段班03_Object C++_03构造函数/命名空间/初始化列
- 20161230C++阶段班03_Object C++_03构造函数/命名空间/初始化列
- 20161230C++阶段班03_Object C++_03构造函数/命名空间/初始化列
- 20161230C++阶段班03_Object C++_03构造函数/命名空间/初始化列
- 20170101C++阶段班03_Object C++_05运算符重载
- 20170101C++阶段班03_Object C++_05运算符重载
- 20161230C++阶段班03_Object C++_03构造函数/命名空间/初始化列
- 20170101C++阶段班03_Object C++_05运算符重载
- 20170101C++阶段班03_Object C++_05运算符重载
- 20161230C++阶段班03_Object C++_03构造函数/命名空间/初始化列
- 20161230C++阶段班03_Object C++_03构造函数/命名空间/初始化列