1、rand() 生成随机数 rand()%100+1 ==>生成1-100之间的随机数。
2、int &a = 10; 报错 可以用 const int &a=10;
void showValue(const int & val)
{
val=100; //error val 不能修改
}
3、函数的占位参数:void func(int a,int) {} 第二个参数就是占位参数。 占位参数也可以有默认值。
4、函数的重载:同一作用域下, 函数名相同,参数类型不同,参数个数不同,参数顺序不同。 但是如果只是函数的返回类型不同不可以。
当函数引用作为参数传递时, void func(int & a) 和void func(const int & a) 属于不同的参数类型。、
函数中使用默认参数,虽然能编译通过,但是调用时会报错,所以要避免。 func(int a,int b=10) func(int a) func(10);//调用时报错
5、类的三种权限:public protected private 默认是private; struct 默认是public.
6、类的构造函数可以有参数,但是析构函数不能有参数。
7、类的拷贝构造函数写法: 必须用常量引用,不能修改传入的类。
class Person
{
Person(const Person &p)
{
}
};
8、匿名对象 Person(10); 调用完后系统会立马回收。
9、类的隐式调用构造函数: Person p=10; //等价于Person p=Person(10);
10、构造函数调用规则: 如果提供了有参构造函数,系统不在默认添加无参构造函数,但是会添加拷贝构造函数。
当提供了拷贝构造函数时,系统不会默认添加其他构造函数。
11、类外不能访问私有静态成员函数。 private: static void func2();
12、静态成员函数的两种访问方式: Person p1; p1.func2(); Person::func2();
13、空对象()Person p; sizeof(p) =1; 空对象的内存地址是1个字节,编译器为了区分不同的空对象内存地址而分配。
14、静态成员变量 类内定义,类外初始化。
15、只有类的非静态成员变量属于类的对象上,非静态成员函数
16、this指针 指向被调用成员函数所属的对象 :可以解决成员变量重名问题 this->age=age , 在函数内返回对象本身 return *this;
this的本质是指针常量,指向的对象不可修改 相当于 Person * const this; 也可以让this指针本身不可修改, const Person * const this;
17、常函数: 成员变量不可修改,可以加mutable关键字使之可修改。
void show() const
{
a=10;// error
b=10;// ok
}
int a;
mutable b;
18、常对象:const Person p; p.a=10;//error 常对象只能调用常函数,不能调用普通成员函数,因为成员函数可以修改成员变量。
19、友元 访问类的私有成员: 全局函数做友元 friend void goodBoy(Person * p);
类做友元 friend class Person;
类的成员函数做友元; friend void Person::visit();
20、 虚继承 解决菱形继承:vbptr 指向 vbtable
21、指针占4个字节。
22、动态多态 virtual: 父类中有虚函数指针 vfptr 指向vftable(表内记录虚函数的地址) 子类的虚函数表会覆盖父类的虚函数表
23、抽象类 只要包含纯虚函数就是抽象类 : virtual void func()=0; 子类必须重写抽象类的纯虚函数,否则无法实例化。
24、虚析构和纯虚析构函数: 相同点是解决父类无法释放子类对象的问题。都需要有具体的函数实现。 不同点是纯虚析构函数是抽象类,不能实例化对象。
指针的释放: string * name;
~func()
{
delete name;
name=NULL;
}