修改失败👆
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 头文件
推荐用第一种