C++基础(二)

*最是人间留不住,朱颜辞镜花辞树。

在这里插入图片描述

一、类/对象

1.1 类和对象的区别

类是一个模板,是对一类事物的抽象描述;
对象是类的具体化、实例,由属性和方法组成;

例:将汽车抽象为一个类,那么奔驰、宝马…就是一个个对象。

1.2 属性和方法

属性相对静态,例如 汽车的长、宽、高;
方法相对动态,例如 汽车的启动、刹车停止。

2.1 类的封装

封装类就是给类添加访问权限:public、private、protected

2.2 类对象的内存尺寸

类对象的内存大小只与类中非静态属性相关,与静态属性及成员函数不相关。
按照内存对齐规则。

二、构造函数/析构函数

构造函数是类中的特殊成员函数,函数名与类名相同,没有返回值,构造函数由编译器自动调用。其重要意义是完成对类对象的初始化。
析构函数当对象被销毁前由编译器自动调用。
析构函数也称之为清理函数。有了析构函数,在析构函数中书写回收类对象中有属性指针指向堆区的资源,这样可以避免内存泄漏。

三、类中属性初始化

1、构造函数中初始化;
2、初始化列表(从右往左依次)
当类中有自定义类对象,类对象没有默认构造时,也必须在构造函数的初始化列表中进行指定。
const 修饰的必须在初始化列表中初始化。
3、静态属性在类外全局区初始化。

四、this指针

1.this第一种作用:当成员函数的形参变量名与类中属性变量名相同,加于区分。
2.this第二种作用:返加本对象 *this;

五、常函数/常函数

六、拷贝构造函数

Stu(const Stu& other)
{
    this->name = other.name;
    this->age = other.age;
    //this->p = other.p;
    //升级深拷贝的过程:
    //1.开辟一块新的同样大小的堆区空间。
    this->p = new int[1024];
    //2.通过memcpy或memmove拷贝原空间中的数据。
    memcpy(this->p,other.p,sizeof(int[1024]));
    cout << "Stu的拷贝构造" << endl;
}

1.使用其它已经定义好(已存在的)对象为本对象(正在构造的)进行初始化时,自动调用拷贝构造。
2.当函数形参为类类型时,会自动调用拷贝构造
3.当函数返回值类型为自定义类类型时,自动调用拷贝构造:
强调:当函数传参,或函数返回值返回时,推荐大家使用使用引用,来避免无意义的拷贝过程:(如果想要保护数据的安全,可以使用const再加以修饰。)

单例

1、饿汉式

#include <iostream>
using namespace std;
class Singleton
{
private:
    //1.把构造函数私有化。
    Singleton()
    {
        cout << "Singleton构造" << endl;
    }
    //4.在类的内部定义一个私有的本实例的指针,并升级为静态属性。
    static Singleton* myInstance;
public:
    //2.设定一个公有接口返回一个实例。
    //3.把这个公有的返回实例的接口升级为static修饰的成员函数。
    static Singleton* getInstance()
    {
        return myInstance;
    }
    
    //C++11所提供的关键字delete
    Singleton(const Singleton& other) = delete;
    void operator=(const Singleton& other) = delete ;
};
//5.类外完成静态单例指针的初始化。这种在类外直接获取一个对象实例的方式也叫饿汉式。
Singleton* Singleton::myInstance = new Singleton();
//饿汉是线程安全。


int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    Singleton* s3 = Singleton::getInstance();

    cout << s1 << endl;
    cout << s2 << endl;
    cout << s3 << endl;

    return 0;
}

2、懒汉式

#include <iostream>
#include <mutex>
using namespace std;
mutex mtx;
class Singleton
{
private:
    //1.把构造函数私有化。
    Singleton()
    {
        cout << "Singleton构造" << endl;
    }
    //4.在类的内部定义一个私有的本实例的指针,并升级为静态属性。
    static Singleton* myInstance;
public:
    //2.设定一个公有接口返回一个实例。
    //3.把这个公有的返回实例的接口升级为static修饰的成员函数。
    static Singleton* getInstance()
    {
        //C++11提供的智能锁:
        lock_guard<mutex> lock(mtx);
        if(myInstance == nullptr)
        {
            myInstance = new Singleton();


        }
        return myInstance;
    }
    //在懒汉设计模式中,如果要释放对象时,请书写一个单独的普能函数来释放本对象的指针指向堆上空间。
    void destroy()
    {
        delete myInstance;
    }
    //C++11所提供的关键字delete
    Singleton(const Singleton& other) = delete;
    void operator=(const Singleton& other) = delete ;
};
//5.类外完成静态单例指针的初始化。
Singleton* Singleton::myInstance = nullptr;
int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    Singleton* s3 = Singleton::getInstance();    
    cout << s1 << endl;
    cout << s2 << endl;
    cout << s3 << endl;
    s1->destroy();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值