c++
std::out_of_range 异常,这是因为在做 substr 时超出了字符串的长度
在 C++ 中,函数 不能直接返回两个独立的值,只能返回一个对象。所以 return x, y; 并不是返回两个值,它只会返回 y(逗号运算符的规则)。
1 | srand(time(NULL)); // 设置随机数种子 |
删除和创建动态内存的首尾两端不带*,判断不带*,其余都带(??)
如果某个参数设置了默认值,他右边所有参数也设置了默认值
重载要求是参数列表不同,返回值类型要相同
参数遮蔽成员变量,赋值无效
SetDate 函数使用了与成员变量同名的参数,导致成员变量被参数“遮蔽”,赋值语句 year = year; 实际上是将参数自身的值赋给自己,完全没有修改成员变量 year。因此,成员变量 year, month, day 一直保持着未初始化的随机值(也就是所谓的“垃圾值”)。当调用 GetYear() 或 Display() 时,这些未初始化的值被读取,输出结果就是随机的巨大整数(如 13370164、14704792 等)。
加载库时,指定库的绝对路径,这样连接器就不会去找其他库
浅拷贝
只复制指针值,多个对象指向同一块动态内存,析构时会重复释放导致崩溃
危害
1 | Student s1("001","zhang","90"); |
这样s1.name和s2.name指向同一块内存,这两个对象在生命周期结束是,都会执行delete[] name,同一块内存被释放两次,程序崩溃
深拷贝
分配新内存,复制内容,各自独立
1 | Student(const Student& other) |
Student& other:other是一个Student类的引用
操作other就是在操作原对象
不能引用null
1 | int a = 5; |
如果用普通传值Student(Student other)
会先复制一份传入的对象,调用拷贝构造函数,造成无限递归
用引用不产生新对象,直接操作原对象
1 | Student(const Student& other):id(other.name),score(other.score){ |
栈
存局部变量,大小固定,离开作用域自动回收
堆
运行时按需申请的空间,大小可以变化,必须手动释放
动态内存就是在我的程序运行时,通过new在堆上申请的内存,用完要用delete手动释放,否则会内存泄漏
1 | int* p = new int(10); //在堆上申请一个int,值是10 |
int* p:p是一个指向int的指针
1 | int x = 10; |
char* name:name是一个指向字符的指针
多态
实现条件
继承关系,虚函数重写,基类指针或引用指向派生类对象
1 | #include<iostream> |
数据成员
类里面用来保存数据的变量
成员函数
类里面定义的函数,用来操作数据成员,或表示对象的行为
class Student : public Person
student类继承了person类,student是person的派生类,person是student的基类,student可以继承person的已有属性和函数
protected和private的区别
private不能被类外部和派生类访问
protected不能被类外部访问,可以被派生类访问
重载
函数名相同,参数不同
c++会根据参数的个数,类型,顺序,自动判断调用哪个函数
运算符重载
让自定义类对象也能使用+ , - ,* ,++ 这些运算符
如有错误,多多指教