C++this指针、拷贝、赋值构造和单例模式 您所在的位置:网站首页 例的结构 C++this指针、拷贝、赋值构造和单例模式

C++this指针、拷贝、赋值构造和单例模式

2024-02-12 03:06| 来源: 网络整理| 查看: 265

C++this指针、拷贝、赋值构造和单例模式 this指针常函数析构函数特殊的成员函数谁来调用析构函数负责什么缺省的析构函数 拷贝构造赋值构造(赋值运算符)关于拷贝构造、赋值构造的建议静态成员单例模式单例模式的应用场景:获取单一对象的方法:C++如何实现单例模式:饿汉模式懒汉模式

this指针

1、类的成员变量单独存储在每个类对象中,成员函数存储在代码段中,所有类对象共享一份成员函数。 2、成员函数是如何区别调用它的是哪个类对象的?

借助了this指针,类的每个成员函数都有一个隐藏的参数this指针,它指向类对象。

3、类的构造函数中也同样有this指针,指向的就是正在构造的这个对象。 4、在类中(成员、构造、析构函数)对成员变量、成员函数访问都是借助了this指针。 5、this指针是隐藏的,但是也可以显式使用:

1、参数与成员名一样时,使用this指针可以区别出成员变量与参数名 2、在成员函数中如果想返回当前对象地指针、引用等,可以使用this指针实现。 3、将this指针作为函数的参数,从一个对象传递给另一个其他类对象,可以实现对象间的交互。 class User { char name[20]; char pass[7]; public: User(const char* name,const char* pass) { strcpy(this->name,name); strcpy(this->pass,pass); show(); } User& func(void) { return *this; } void show(void) { cout mutable char name[20]; // mutable修饰成员name char pass[7]; public: User(const char* name,const char* pass) { strcpy(this->name,name); strcpy(this->pass,pass); show(); } User& func(void) { return *this; } void show(void) const { strcpy(name,"--------"); // 在常函数内修改name的值 cout if(this != &that) { delete[] name; name = new char[strlen(that.name)+1]; strcpy(name,that.name); } return *this; /* 方法2 User temp(that); swap(name,temp.name); */ } 关于拷贝构造、赋值构造的建议

1、拷贝构造、赋值构造函数不光会拷贝本类的数据,也会调用成员类对象和父类的拷贝构造和赋值构造,而不是单纯的按字节复制,因此尽量少用指针成员。 2、在函数参数中尽量使用类指针或引用来当参数(不要直接使用类对象),减少调用拷贝构造和赋值构造的机会,也可以降低数据传递的开销。 3、如果由于特殊原因无法实现完整的拷贝构造、赋值构造,建议将它们私有化,防止误用。 4、一旦为一个类实现了拷贝构造,那么也一定要实现赋值构造。

静态成员

1、类成员一旦被static修饰就会变成静态成员,单独一份存储在bss或data内存段中,所有的类对象共享(静态成员属于类而不属于某个对象)。 2、静态成员类内声明,类外定义、初始化,与成员函数一样需要加"类名::"限定符表示它属于哪个类,但不需要再额外加static。 3、成员函数前也可以被static修饰,这种函数叫静态成员函数,这种成员函数没有this指针,因此在静态函数中不能再直接访问类的成员变量、成员函数,但可以直接访问静态成员(成员函数和成员变量)。 4、静态成员变量、函数依然受访问控制限定符的影响。 5、因为在代码编译完成后,静态成员已经定义完成,有了自己的存储位置和存储空间,因此可以不通过类对象而直接调用,而通过"类名::静态成员名"可以直接调用。 6、普通成员函数可以直接访问静态成员变量、静态成员函数。 7、静态成员变量可以被当作全局变量来使用(访问限定符必须是public),静态成员函数可以当作类的接口,实现对类的管理。

单例模式

单例模式是只能创建出一个类对象(只有一个实际的实例)的叫单例模式。

单例模式的应用场景: 1、Windows系统的任务管理器 2、Linux/UNIX系统的日志管理器 3、网站的访问计数器 4、服务端程序的连接池、线程池、数据池 获取单一对象的方法: 1、定义一个全局(C语言),但不受控制。 2、专门写入一个类,把类的构造函数设置私有,借助静态成员函数提供一个外部接口以此来获取唯一的实例。 C++如何实现单例模式:

1、禁止类在外部创建类对象:构造函数设置私有 2、类自己维护一个唯一的实例:使用一个静态指针指向 3、提供一个获取实例的方法:静态成员函数获取静态指针

饿汉模式

将单例类的唯一实例对象定义为成员变量,当程序开始运行时,实例对象就已经创建完成。 优点:加载进行时静态创建单例对象,线程安全。 缺点:无论使用与否,总要创建,浪费内存

class Singleton { private: Singleton(void) { } static Singleton object; public: static Singleton& get_object(void) { return object; } void show(void) { cout private: Singleton(void){} static Singleton* objectp; public: static Singleton& get_object(void) { if(NULL == objectp) { pthread_mutex_lock(&mutex); objectp = new Singleton; pthread_mutex_unlock(&mutex); } return *objectp; } void show(void) { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有