一、两个特殊的构造函数
(1)无参构造函数:当类中没有定义构造函数时,编译器将默认提供一个无参构造函数,函数体为空。
(2)拷贝构造函数:当类中没有定义拷贝构造函数时,编译器将默认提供一个拷贝构造函数,并对成员变量进行简单的复制。
- 浅拷贝构造函数
- 深拷贝构造函数
深拷贝的标准:对象中的成员使用了指向系统中的资源。
二、初始化列表
类中的const成员变量,必须由初始化列表对其指定初值。初始化列表先于构造函数的函数体执行。
三、const对象只能调佣const成员函数。
四、类成员
每一个对象都有自己的一套成员变量,但是所有对象共享一套成员函数。
五、静态成员变量
(1)隶属于所有类,被所有对象所共享,定义时需添加static修饰。
(2)生命周期不依赖于任何对象。
(3)通过类名直接访问,也可以通过对象名单独访问。
(4)静态成员变量位于全局数据区并单独分配空间。
六、静态成员函数
(1)隶属于所有类,定义时需添加static修饰。
(2)通过类名直接访问公有静态函数,也可以通过对象名访问。
(3)没有隐藏的this参数。
(4)静态成员函数只能访问静态成员变量或函数。
静态成员函数 VS 普通成员函数 | ||
静态成员函数 | 普通成员函数 | |
所有对象共享 | √ | √ |
隐含this指针 | × | √ |
访问普通成员变量(函数) | × | √ |
访问静态成员变量(函数) | √ | √ |
通过类名直接调用 | √ | × |
通过对象名直接调用 | √ | √ |
七、二阶构造函数
(1)构造函数只能决定对象的初始状态,不能决定对象诞生的正确性(半成品对象)。
(2)二阶构造函数
构造函数中的初始化操作失败不影响对象的诞生。
二阶构造能保证创建的对象是完整初始化的。
(3)二阶构造步骤
-第一阶段做资源无关的初始化操作。
-第二阶段做系统资源的申请操作。
示例:
#include <QCoreApplication>
#include <QDebug>
class TwoPhaseCons
{
private:
int *m_point;
TwoPhaseCons()//第一阶段构造函数,做与申请资源无关的操作
{
}
bool construct()//第二阶段构造函数,做与申请资源有关的操作
{
bool ret = true;
m_point = new int[10]; //假设此处申请资源
if(!m_point) //判断是否成功,并返回。
{
ret = false;
}
return ret;
}
public:
static TwoPhaseCons* NewInstance()
{
TwoPhaseCons* ret = new TwoPhaseCons();
if(!(ret && ret->construct()))
{
delete ret;
ret = nullptr;
}
return ret;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
TwoPhaseCons *twoPhaseCons = TwoPhaseCons::NewInstance();
qDebug()<<twoPhaseCons;
return a.exec();
}
八、友元
(1)在实际工程开发中非必要不使用友元关键字,友元破坏面向对象的封装性。
(2)类的友元可以是其它类的成员函数或者某个完整的类。
九、函数重载
(1)本质上是相互独立的不同函数。
(2)通过函数名和参数确定函数调用。
(3)重载发生在同一个作用域中。
十、操作符重载
(1)operator关键字是实现操作符重载的关键。
(2)operator的本质是通过函数重载操作符。
(3)操作符重载不能改变原操作符的优先级。
(4)操作符重载不能改变操作数的个数。
(5)操作符重载不应改变操作符的原有语义。
(6)操作符重载的本质为函数定义。
Demo示例:
#include <QCoreApplication>
#include <stdio.h>
const char endl = '\n';
class Console
{
public:
Console& operator<<(int i)
{
printf("%d",i);
return *this;
}
Console& operator<<(double d)
{
printf("%f",d);
return *this;
}
Console& operator<<(char c)
{
printf("%c",c);
return *this;
}
Console& operator<<(char* s)
{
printf("%s",s);
return *this;
}
};
Console cout;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout<<1<<endl;
cout<<'a'<<endl;
cout<<"abcdefg"<<endl;
cout<<1.2345<<endl;
return a.exec();
}
-
十一、C++标准库
C++标准库是由类库和函数库组成的集合
C++标准库包含了经典算法和数据结构实现
C++标准库涵盖了c库的功能
C++标准库位于std命名空间中