目录
命名空间
防止同名:
只是用于区别同名函数和同名全局变量(编译时,在链接阶段,找定义时用到)
比如一个大型项目中,分不同模块,由不同的人写,则可能出现同名函数或同名全局变量
构造函数 析构函数 初始化列表 构造函数的隐式调用
构造函数:是对象申请内存空间之后自动调用的函数(类似于c中的变量的定义)
没有返回值 类名
析构函数:是对象的内存空间被销毁前自动调用的函数
没有返回值 ~类名 参数列表为空
类名::类名(参数1,参数2,…)
:类成员(参数1),类成员(参数2) {
…
}
同一个类中可以有多个参数列表不同的构造函数(函数重载)
当且仅当一个类中没有声明构造函数时,编译器会自成一个无参无内容的构造函数(缺省函数)
在构造函数只有一个参数时,就可能出现构造函数的隐式调用现象(实际上是为了让c++的对象可以像c一样,用 容器 = 值 的形式)
例:Stu s1 = “Tom” (隐式调用构造函数 Stu s1(“Tom”))
在构造函数声明前加上explicit关键字,可禁止构造函数的隐式调用
new delete 和 malloc free
c++中的new,delete和c中malloc,free区别:
malloc,free是函数,而new,delete是关键字或者说是表达式
在new和delete对象时,会调用构造或析构函数
Stu *p = new Stu();
delete p;
Stu *p = new Stu[5]; //此时会调用无参的构造函数
delete []p;
静态成员 常量成员
静态成员:
属于整个类的属性或行为,而非属于某个对象的
在定义类时,静态成员变量一定要定义
静态成员函数,本质上没有this指针
常量成员:
常量成员函数,本质上this指针为常量指针
拷贝构造函数 引用
引用:
本质是对象的别名,作用其实相当于c中的指针
不新建对象,可在传递函数参数时,避免调用构造函数
初始化时必须绑定,且一经绑定无法解除
变量(c的结构)只能用指针,对象(c++特有的结构)大多用引用
拷贝构造函数:
用一个对象,创建另一个对象时
类似于c的变量的值传递,它是为了解决对象的值传递
唯一的形参必须是构造对象的引用
调用:在创建对象时调用,否则可能调用赋值运算函数
1. 对象作为函数参数(值传递)
2. 对象作为函数返回值(值传递)
3. 用一个对象给另一个对象初始化
缺省函数
在定义类时,如果没有显式写出这些函数,编译器在编译代码时,会自动生成这些缺省函数
- 无参的构造函数
- 无参的析构函数
- 带一个参数的拷贝构造函数
- 带一个参数的赋值运算函数
其形式大致如下:
// 构造函数
A(){}
// 带一个参数的拷贝构造函数
A(const A& a)
{
// 这儿调用了赋值重载函数
*this = a;
}
// 析构函数
~A(){}
// 重载赋值操作符
A& operator =(const A& a)
{
// 这个地方可能有点不当,只是为了表明这是一个浅拷贝
memcpy(this, &a, sizeof(A));
return *this;
}
友元函数和友元类
可以直接访问其非共有成员
例:
friend Complex add(const Complex& other1,const Complex& other2);
friend Class Stu;
函数重载 默认参数
为了提高复用性:
函数重载:多个的函数名相同;参数不同(参数的参数,参数的类型),函数实现方式不同
函数模板:参数类型不同,函数实现方式相同
回调函数:函数实现方式不同,参数和返回值相同(一个回调指针指向多个回调函数)
默认参数和函数重载可能会出现二义性问题,例void fun()和void fun(int i=0)
函数模板
特化
template<typename T>
bool isEqual(T i, T j);
template<typename T>
bool isEqual(T i, T j) {
return i == j;
}
template<>
bool isEqual<char*>(char *i, char *j) {
return strcmp(i, j) == 0;
}
偏特化
类模板
特化
偏特化
类模板做出的五大容器,参见...
封装
继承
三种继承方式
多继承
菱形继承
虚继承
多态
虚函数
纯虚函数、抽象类
基类指针
设计模式
单例模式
工厂模式
观察者模式
策略模式