《C++快速入门》学习笔记
进度:P37
【函数指针】
指向函数首地址的指针变量
1、 在声明的过程中,书写的格式就是在平常声明函数的基础上加上一个*号(和括号)用以区分是指针
2、 在初始化函数指针的时候,将函数名赋值给指针,即将内存首地址存入了指针
3、 可以试着用条件运算符?:来简化书写
![27e78cf8f92c803899c721bccfb7d18f.png](https://img-blog.csdnimg.cn/img_convert/27e78cf8f92c803899c721bccfb7d18f.png)
【指针函数】
是可以带回一个数据值的函数,包括整型、字符型、浮点型、指针类型。
1、 在声明时指针函数不带括号
下例当中的int* newInt(int value);的意思是函数的返回值是一个int类型的指针,而上例的int(*p)(int a, int b)的意思是声明的是一个指向函数的指针
![f370ee971a7cb2a3c46513963e807e66.png](https://img-blog.csdnimg.cn/img_convert/f370ee971a7cb2a3c46513963e807e66.png)
【副本构造器】
1、 我们可以吧一个对象赋值给一个类型相同的变量,编译器将生成必要的代码把“源”对象各属性的值分别赋值给“目标”对象的对应成员,这种复制行为称之为逐位复制。
2、 逐位复制在绝大多数场合都没有问题,但如果某些成员变量是指针的话,对象成员进行逐位复制的结果是将会产生两个一模一样的实例,而这两个副本里的同名指针会指向相同的地址。当删除其中一个对象时,它包含的指针也将被删除,如果此时另一个副本还在引用这个指针,就会出问题。
3、 例如在声明了两个同类型的对象obj1和obj2时,在执行obj1=obj2时就可能出现上面的问题,所以我们通过重载赋值符号来实现。
1、 我们将赋值符号的重载函数放在了MyClass类当中,所以当调用obj1=obj2这一语句的时候,实际上是调用obj1这个对象中的重载函数
2、 在对MyClass进行实例化的时候,MyClass obj1(new int(1));语句实际上是先new了一个int类型的指针,并把指针所指向的地址的值修改为1
3、 重载函数MyClass& operator=(const MyClass& rhs)使用的参数是右边对象的一个引用,因为这样编译器在传入参数的时候不会为它再创建一个副本(否则可能导致无限递归←我自己没想明白为啥无限递归)。而又因为这里只需要读取输入的参数,而不改变它的值,所以用const把它声明为了一个常量。
4、重载函数返回的是一个指向MyClass类的对象,看起来似乎在本例中没有必要,但这确实是一个好习惯,另外的好处是方便我们把一组赋值语句穿起来,如a=b=c
![b3bc41b758882650422a5ed66dc7eb73.png](https://img-blog.csdnimg.cn/img_convert/b3bc41b758882650422a5ed66dc7eb73.png)
1、 刚才是先创建两个对象,再进行赋值;而现在是先创建一个obj1的实例,然后在创建obj2的实例的同时用obj1的值对它进行初始化。但是编译器会生成完全不同的代码:编译器将在MyClass类里面寻找一个副本构造器(copy constructor),如果找不到,它会自行创建一个,然后进行逐位拷贝。
所以我们要亲自定义一个副本构造器,MyClass(const MyClass& rhs),因为是一个构造器,所以不需要返回类型。
![ff9c8e2d5b7c1f084b24ac94601b86e4.png](https://img-blog.csdnimg.cn/img_convert/ff9c8e2d5b7c1f084b24ac94601b86e4.png)
运行结果如下:
![b79440197f9af57de3d1e3be03e5535c.png](https://img-blog.csdnimg.cn/img_convert/b79440197f9af57de3d1e3be03e5535c.png)
写在后面:
不得不说指针真的是一个很危险的东西(虽然同时也很方便)——忘记释放了不行、拷贝指向同一个地址也要出问题。
副本构造器好像有些书里的直接在构造器那里讲的,我觉得小甲鱼这个地方循序渐进还讲得蛮清楚的,思路很清晰。
大概是这样!
![dc5d473306bb306da95f168728f4793e.png](https://img-blog.csdnimg.cn/img_convert/dc5d473306bb306da95f168728f4793e.png)
IT双侠的咕咕咕日常
内容:咸哥
排版:咸哥
特别鸣谢:小甲鱼、拓哥