给指针地址赋值会出现错误码_C++快速入门学习笔记7|函数指针/指针函数/副本构造器...

《C++快速入门》学习笔记

进度:P37

【函数指针】       

指向函数首地址的指针变量

1、 在声明的过程中,书写的格式就是在平常声明函数的基础上加上一个*号(和括号)用以区分是指针

2、 在初始化函数指针的时候,将函数名赋值给指针,即将内存首地址存入了指针

3、 可以试着用条件运算符?:来简化书写

27e78cf8f92c803899c721bccfb7d18f.png

【指针函数】

是可以带回一个数据值的函数,包括整型、字符型、浮点型、指针类型。

1、 在声明时指针函数不带括号

下例当中的int* newInt(int value);的意思是函数的返回值是一个int类型的指针,而上例的int(*p)(int a, int b)的意思是声明的是一个指向函数的指针

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

1、 刚才是先创建两个对象,再进行赋值;而现在是先创建一个obj1的实例,然后在创建obj2的实例的同时用obj1的值对它进行初始化。但是编译器会生成完全不同的代码:编译器将在MyClass类里面寻找一个副本构造器(copy constructor),如果找不到,它会自行创建一个,然后进行逐位拷贝。

所以我们要亲自定义一个副本构造器,MyClass(const MyClass& rhs),因为是一个构造器,所以不需要返回类型。

ff9c8e2d5b7c1f084b24ac94601b86e4.png

运行结果如下:

b79440197f9af57de3d1e3be03e5535c.png

写在后面:

不得不说指针真的是一个很危险的东西(虽然同时也很方便)——忘记释放了不行、拷贝指向同一个地址也要出问题。

副本构造器好像有些书里的直接在构造器那里讲的,我觉得小甲鱼这个地方循序渐进还讲得蛮清楚的,思路很清晰。

大概是这样!

dc5d473306bb306da95f168728f4793e.png

IT双侠的咕咕咕日常

内容:咸哥

排版:咸哥

特别鸣谢:小甲鱼、拓哥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值