C++核心编程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 修改失败👆

 

  

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 100

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 传10 第一个 第三个 可以调

传a 第一个 第二个 可以调

 

  

 

 

 

 

  

 

失败

 

 

 

 

 

 

 

 

 

 人吃狗粮

 

 

 

 

 

 写struct的原因目的是懒得写public 

c++中更多的是用class 是对象的操作

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 值传递 copy 提高效率用&c1

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 shift  tab 往前 tab 往后 缩进

 

 

 

 

 

构造函数 

 ​​​​​​​

 main函数为什么不打印析构 因为main还没有结束

 

 ​​​​​​​

 值传递 还要进行一个拷贝 值传递的本质就是调用拷贝构造函数 一直的递归

 

 ​​​​​​​

 

 函数声明

栈上 先进后出 p4  p3析构函数

 

 

 ​​​​​​​

 

 

 

 

 拷贝构造 是return 新的匿名的构造 等号左边是它的名称 他的生命周期 跑到左边了 上边的对象65创建完就释放掉了  retrun 是值的方式返回 不是引用的方式返回 如果把引用返回 他就被释放了 无法操作

release 会做隐式优化 做简化 

 

 

 

 

 能打印出年龄 

如果有有参的就不会提供无参的

 

 拷贝构造打开,就不会提供默认构造(无参构造)

 

 

 

 如果内存放在堆区,析构函数可以把堆区的内存释放

 

 

应该由p2释放内存 

 

 

 

 

 

 

 

 

 

 

 

 提供有参构造

 

 ​​​​​​​

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 堆区开辟的内存手动开辟手动释放 只要不写释放的代码他都不会释放

 

*强转还是可以释放的 

 

 ​​​​​​​

 

 

不同编译器不同的处理 👇 为了兼 容性不要去写

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 ​​​​​​​

 

 

通过克隆 一个新的指针

 ​​​​​​​

 对象创建在堆区,指针不会占太大空间, 当程序结束掉,系统帮你回收

 

 

 

编译阶段就打印这段代码了, 

 

 ​​​​​​​

 

 

 

 

 

 空间大小为1

 

 

 

show 16

改为1 没有内存对齐了,是12 

 

 

谁调用这个函数 这个this指针指向的就是谁

age不是18 

 ​​​​​​​

 

 ​​​​​​​

 

 

 

 

 

 每次访问都会创建一个新的p1撇  p1撇撇 不是对p1进行操作 而是对拷贝出的对象进行操作

 

 

 

 如果把相加的值都返回我身上 我返回引用 一直对p1进行修改

如果相加的时候 p1年龄加上p2的年龄 创建出p3的人 这时候返回的是新的人

 

 

 中断👆  this指针指向的是null

 

 ​​​​​​​​​​​​​​

 

 ​​​​​​​

 

 

 常对象创建到栈上,

 

 

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

  

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

  

 

 ​​​​​​​

 

 

 

 

 

 

一般不用成员函数,因为习惯性把cout放在左边

 

 

 

 可以用原名也可以用别名

全局函数作为私有可以使用友元

 

 

 

 

 

 

 

 如果返回值的话 结果是  2  1

 如果返回引用相当于把临时的对象按引用的方式返回,但临时的对象超出作用域之后没有效,所以这个temp就出问题了

 返回的已经不是b了,因为他返回的只能是值的方式返回,所以再后置++操作已经不是b了,所以他不允许你这样操作👇

 

 

 T&返回的是引用 

 

 

 

 对象new到栈上

 ​​​​​​​

 

 

 return *m_person返回Person是 按照他的本体拷贝构造一份新的数据,现在只要引用Person& 返回自身

 

 

 

 ​​​​​​​

 

 

 

浅拷贝 崩溃

  

 

 

 

 

 Person p4= p3 是拷贝构造,

 深拷贝👆 

 值拷贝 是浅拷贝

 ​​​​​​​​​​​​​​

 

 

函数的返回值是在做函数的调用,其实你在做函数的调用 普通函数 调用 可以作为等号的左值 函数的调用可以作为左值还可以进行计算还可以进行赋值,你要返回引用 把具体元素的位置 按引用的方式返回

 普通函数调用可以作为左值

 

 整个的函数调用作为左值存在,不能简单的返回int 还要返回int的引用 才可以返回数据 来进行继续的操作, 赋值也没有问题 索引也没有问题

 

 

 

 

 ​​​​​​​

 

 第一个()代表重载这个()

第二个()代表函数的形参列表

 

 MyAdd()(1,1)    MyAdd()是匿名对象,执行完之后就释放了,特点是更多于用于这个  仿函数

 本身栈上的对象不用管,他执行完之后,会自动执行析构函数

 

 特性没法模拟 

 

 

 

 左移右移写成全局,其他的都往成员上放

 

 ​​​​​​​

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 

 

如果想要返回他的左值来运算的话,要返回他的引用

 

 ​​​​​​​

 

 

 

 

 ​​​​​​​​​​​​​​

 

 

 

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 访问不到不代表没有继承下去,

 

 

 

 

 

 

 

 ​​​​​​​

 

 入栈顺序,先进后出的条件

 

 

 

 

 

 父类默认提供的函数,子类是不会继承下去的

 

 

 

类似于就近

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 sizeof=16

 

 

 不建议做多继承的操作,原因就是没法保证两个人的名称是否有冲突

dir   cls

 

 ​​​​​​​​​​​​​​

 

 

 

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 子类可以加可以不加

 

 

 

 

 

 

 

代码崩掉

 我们调用参数影响的是入栈的顺序 从左到右 还是从右到左 出栈方 主调函数还是被调函数 还有一个还是名称的修饰 但其实对于入栈的顺序 从左到右 还是从右到左 其实没有什么影响因为我们只有一个参数 从左到右 还是从右到左都是他 那这时候出现问题的地方其实更有可能在出栈方 这一块 到底谁来释放 肯定是他俩调用关系不同 所以导致一个人认为主调函数 去释放,一个认为被调函数去释放 所以导致代码崩掉了 那这时候我要指定函数是__stdcall的时候怎么去做  我们需要把函数指针重新定义下他 有一种函数用typedef 来定义函数指针 定义函数的类型FUNPOINT 在这个类型前面你还可以写一个东西就是你的调用惯例

 

 

 

 

 ​​​​​​​

 

 ​​​​​​​

 

 ​​​​​​​​​​​​​​

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 

 ​​​​​​​

 

 

 

 ​​​​​​​

 ​​​​​​​

 

析构代码不能发生重载,或者只有一个析构代码

 

 

 

 

 

 

  

小练习👆 

 

 

 

 

 

 

 

 

 

 

 new  堆区

 

 

 

  

 

 ​​​​​​​

 

 

 

 

 

 

 

  

 ​​​​​​​ 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 ​​​​​​​

   

 

 

 

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 ​​​​​​​

 

 

 

 

 报错,应该包含cpp

类模板种的 成员函数,是一开始就创建出来的,

成员函数 类模板中的成员函数,一开始不会创建 导致了person.cpp种的这两个函数的实现,所以在链接的时候连接不到 链接的时候到底找不到构造函数在哪?他都看不见  你如果设置.cpp所有东西他都能看得见, 很少提供cpp源码 一般不建议提供源文件,类模板中的成员函数,也不建议去做分链编写 

你可以写在类内实现,  也可以通过类外实现, 但是要写在同一个文件夹 文件下边  又有声明 又有实现 .hpp文件

 分链编写你必须包含源文件,头文件里面的代码又不会给你生成连接不到那个源代码 

又不建议包含源文件

 

 

 ​​​​​​​

 

 

 17是模板还是普通函数 他是普通函数 ,不要认为 有t1 和t2他就是一个模板 t1 和t2是上面给的 6

如果下面紧跟着是一个类  17这个整体是一个类模板,而他的函数还是一个普通的函数,因为这也不算他的成员函数么21  成员函数

而下面的实现 33 是一个模板  上面是一个普通的,下面是一个模板的所以导致出错了,找一个模板函数没实现,找到一个模板的实现, 这时候你要告诉编译器这是一个模板 33 函数模板的实现,怎么去调用?

 加上<>告诉他是一个模板 17 

如果你要说他是内外一个实现的话,你需要让编译器先看一下他的函数说明 17 因为他是一个模板,如果你是一个普通的函数10,你可以把声明和实现都写在一起,如果他是一个模板 那必须先让编译器知道有这样一个模板存在,

  

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 

 

 

 

 

 

 ​​​​​​​

 

 堆区开辟 堆内存数组一定会调用构造

 堆区开辟内存数组一定会调用构造函数

可以什么都不写,但是必须要有? 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 

 

 如果发生多态的情况下 类型之间转换总是安全的 

父类中要有虚函数,总得有虚函数才能发生多态 

 多态父类的指针指向子类对象,

 

 

 const int a = 10 放在vos表?如果你只写 int b 他是放在栈上了

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 类名加()是匿名对象 

 

 

 ​​​​​​​

 

 

 

 

 

 

 

 

 

 

 我只允许你抛int类型的异常  你抛得是double类型的

 ()代表什么都不让你抛了

 

 

 

 

 

 

 

 

 ​​​​​​​

 ​​​​​​​

 

 

 

 

 

 

 

 ​​​​​​​

 

 

 

 

 

 

 重写可以不用写virtual

 

 

 

 

 

一个类型加一个小括号 叫匿名对象  调用有参构造函数

 i OS 代表评估操作系统

ios 代表输入输出流

 

 

 

  

 

 

 

 

 

  

 

 

 

 

   

 偷看了一眼a没有在缓冲区里面取走

 

​​​​​​​ 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 他内部重载一些东西,直到读不出来东西就会退出这个循环,实际上是一行一行在读这个数据 直到读完为止

 string 头文件

 推荐用第一种

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值