C++学习笔记(From慕课网)
(慕课网视频学习--C++离港篇的学习memo)
1: 函数的参数默认值,只能在最右边。 如果有三个参数,只有中间一个有默认值,这是错误的。
函数声明的时候写默认值,定义的时候不要写。(有些编译器会出错。)
2:内联函数:编译时,将函数体实参和代码替换掉调用语句。
关联字 inline
内联函数是建议性的,由编译器决定。
逻辑简单,调用频繁的建议使用内联。
递归函数不能成为内联函数。
3: 内存申请 new 内存释放 delete 注意,释放数组的时候,用 delete []p;
申请可能失败,
int *p = new int[100];
if(NULL == p){
//内存申请失败
}
注意,释放完内存后,再将相应的指针赋值为NULL;
4 string aaa = "Hello" + "world!"; // 这种定义是非法的,只能是常量+变量的形式。
5:类内定义的函数优先编译成内联函数!
------------------------------------------------------------------------------------
1: 构造函数 初始化列表
class Student{
public:
Student():name("Tom""), age(33){} //冒号开头,多个变量的话,逗号隔开。
private:
int age;
string name;
}
注意: 初始化列表先于构造函数执行。 而且只能用于构造函数。
常量只能用初始化列表初始化。
2: 拷贝构造函数。把一个对象赋值给另外一个对象时,自动调用拷贝构造函数。
如果没有,则自动生成一个默认的拷贝构造函数。
3 析构函数 ~类名() 释放内存等工作。
不允许有参数。不能重载。没有返回值。没有的话,会自动生成一个默认的。
------------------------------------------------------------------------------------
C++继承的时候,子类和父类有同名函数的时候
就说,子类的函数隐藏了父类的函数。
比如,父类是Person,子类是Solider
隐藏的函数是play()
调用子类的函数 solider.play();
调用父类的函数 solider.Person::play();
注意: 就算子类的函数play加上参数,也必须用上面的方式调用父类的函数。
如果用父类指针指向子类对象,那么父类的析构函数应该定义成虚函数。virtual
如果B,C 继承A, D继承B,C
这种就叫做菱形继承,这个时候,A 需要再内存中只有一份。
B,C需要使用虚继承。 如下面代码:
class B: virtual public A{};
------------------------------------------------------------------------------------
C++继承的时候,子类和父类有同名函数的时候
就说,子类的函数隐藏了父类的函数。
比如,父类是Person,子类是Solider
隐藏的函数是play()
调用子类的函数 solider.play();
调用父类的函数 solider.Person::play();
注意: 就算子类的函数play加上参数,也必须用上面的方式调用父类的函数。
如果用父类指针指向子类对象,那么父类的析构函数应该定义成虚函数。virtual
C++中的抽象类是通过纯虚函数来实现。