【C++】C++学习笔记之二:类

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;
}

编译上面代码会报错:

【C++】C++学习笔记之二:类_第1张图片
Paste_Image.png

4.2 赋值构造函数

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. 析构函数

你可能感兴趣的:(【C++】C++学习笔记之二:类)