1. 类的类型
1.1 不带指针类型成员的类
不带指针型的类,一般不会有额外的内存空间与之关联,所有内存占用情况都由其数据类型决定。不需要显示的编写析构函数、赋值构造函数,以及重载赋值操作符函数。编译器会给不带指针类型成员的类默认的。
1.2 带指针类型成员的类
与不带指针类型成员类相反,带指针成员的类一般都会需要动态申请内存。 必须显示的编写赋值构造函数和重载赋值操作符,显示的编写析构函数,并在其中释放申请的动态内存,防止内存泄露。因为编译器默认给每个类的这三大函数都属于浅拷贝,只会按照bit复制类成员数据,也就是说,对于指针成员只会拷贝指针地址,并不会复制指针所指动态内存的部分。
<图例>
2. 类的组成
类体(class body)可以由一下部分组成:
构造函数
析构函数
操作符重载
成员函数(包括公有的外部可以调用的函数,和私有的只在类内部调用的函数,虚函数等)
友元函数声明
数据成员(一般为私有)
类成员函数都带有一个隐形参数——那就是this指针
3. 类中的访问级别
3.1 private
只有类自己和友元可以使用的数据
3.2 public
所有人都可以通过类对象调用其公有数据和成员函数。
3.3 protected
只有类自己及其子类可以调用protected成员
4. 构造函数
4.1 带默认值的构造函数
当参数列表中既有带默认值的参数,又有不带默认值的参数时,带默认值的参数一律写在后面。
class Date{
int year;
int month;
int day;
public:
Date(int _year=1970, int _month = 1, int _day = 1):year(_year), month(_month), day(_day){}
};
构造函数可以重载来适应各种参数形式的初始化,但不能有冲突:
class Date{
public:
int year;
int month;
int day;
public:
Date(int _year = 1970, int _month = 1, int _day = 1):year(_year), month(_month), day(_day){}
Date():year(1971), month(2), day(2){}
Date(int year, int _month, int day = 10):year(_year), month(_month), day(_day){}
};
int main(){
Date d;
cout << d.year << "-" << d.month << "-" << d.day << endl;
return 0;
}
编译上面代码会报错:

4.2 赋值构造函数
<TBD>
4.3 私有化构造函数——singleton设计模式
一般构造函数都要写成共有的,这样才能随意创建对象。但是私有构造函数也有着独特的应用,这就是设计模式中大名鼎鼎的singleton(单例模式)
class Singleton{
public:
static Singleton& getInstance(){
static Singleton s;
return s;
};
void setup(){.......}
private:
Singleton(){}
Singleton(const Singleton& rhs){......}
};
//调用
Singleton::getInstance().setup();
PS:重载函数的原理
编译器会把函数名与参数类型个数结合起来,联合编译成一个唯一的函数标识 ,这样就不会在调用时出现歧义。
<图例>
5. 析构函数
<TBD>
网友评论