您的位置:首页 > 移动开发 > Objective-C

20170101C++阶段班03_Object C++_04构造函数/赋值函数/拷贝构造/

2017-01-11 17:25 351 查看

构造函数&赋值函数&拷贝构造函数&学习方式

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(如果有定义/无定义执行,多用于防止二次编译)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 对象