学构造函数的这辈子有了

2024-08-31 10:52
文章标签 构造函数 这辈子

本文主要是介绍学构造函数的这辈子有了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拷贝构造函数

1.拷贝构造函数,是一个特殊的构造函数。系统默认提供了。但是可以手动定义。

2.功能:使用一个类对象给另一个类对象初始化时,会自动调用拷贝构造函数

3.定义格式

1、没有返回值
2、函数名与类同名
3、参数:该类的其他对象的引用
4、访问权限:一般为public
5、定义格式:类名 (类名 &other)

调用时机:

使用一个类对象给另一个初始化时:

string s1("hello world"); //调用有参构造

string s2 = s1; //调用拷贝构造

string s3(s1); //调用拷贝构造

使用值传递时实参取代形参时调用拷贝构造函数。

使用值返回时返回结果也是调用拷贝构造。

深浅拷贝问题:

如果类中有指针成员并且指向其它空间时,应调用深拷贝

使用浅拷贝就会出现多个对象中指针成员指向同一个内存空间,析构指针空间时,会造成对同一块内存空间的多次释放的情况,造成段错误(double free),此时就需要深拷贝。

深拷贝需要程序手动定义拷贝构造函数,在拷贝构造函数的初始化列表中,给新对象的指针成员重新分配空间,将原来对象指针空间指向的内容拷贝到该空间中即可完成深拷贝

Stu(Stu &other):name(other.name),age(other.age),score(other.score),ptr(new int(*other.ptr)){cout<<"Stu::深拷贝构造函数"<<endl;}

移动构造函数

如果类中不显性定义拷贝构造函数或者移动构造函数,那么系统会自动提供这两个函数,如果程序员手动定义了其中任意一个函数,系统就两个都不提供了,如果需要使用,则需要程序员自己手动定义

移动构造函数,是将临时空间或将亡空间,托管给一个新的对象。

1、没有返回值
2、函数名与类同名
3、参数:该类的其他对象的右值引用
4、访问权限:一般为public
5、定义格式:类名 (类名 &&other)
//自定义移动构造函数Stu(Stu &&other):name(other.name),age(other.age),score(other.score),ptr(new int(*other.ptr)){cout<<"Stu::移动构造函数"<<endl;}//调用移动构造函数Stu s3 = move(s1);

取地址运算符重载函数

功能:取得当前类对象的地址

定义格式

1、返回值:当前类的指针
2、参数:无
3、权限:一般为public
4、格式: 类名 * operator&()
    //自定义取地址运算符重载函数Stu * operator&(){cout<<"取地址运算符重载函数"<<endl;return this;}//取地址运算符重载函数&s1;

一个空类中默认提供的特殊成员函数

class Temp
{public:Temp(){}                   //无参构造Temp(const Temp &other){}     //拷贝构造~Temp(){}                        //析构函数Temp * operator&(){return this;}     //取地址运算符重载函数Temp(const Temp &&other){}     //移动构造Temp &operator=(const Temp& other){}      //拷贝赋值函数Temp &operator=(const Temp&& other){}      //移动赋值函            
};

这篇关于学构造函数的这辈子有了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123696

相关文章

C++中第一次听到构造函数

在C++中第一次听到构造函数这个名词,在C#中又遇到了。   在创建某个类时,由于对该对象的状态(数据)不是很明确,因此需要对其进行初始化。比如说我们要在长方形这个类中创建一个对象,或者说新建一个长方形,那么我们首先要确定他的长和宽,假如我们无法确定它的长和宽,那么我们是无法造出一个长方形来的。所以就要使用这个长方形类中一个用来构造该类所有对象的函数--构造函数。由于该函数要在创建一个新对象

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

为什么构造函数不能为虚函数

1,从存储空间角度     虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。 2,从使用角度         虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调

【JavaScrip】为什么箭头函数不能做构造函数

在 JavaScript 中,箭头函数(Arrow Functions)的设计初衷是为了简化函数声明,并引入了一些新的语法特性。其中一个关键特性就是箭头函数不能用作构造函数。下面我们详细探讨这个问题的原因。 1. 箭头函数的特点 箭头函数有一些独特的特点,其中最重要的是: ● 词法作用域的 this: 箭头函数内部的 this 值绑定到定义时所在的上下文环境,而不是调用时的上下文环境。 ● 简

C/C++ 拷贝构造函数

一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp]  view plain copy int a = 100;   int b = a;    而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象拷贝的简单例子。 [c-sharp]  view p

【自用19.1】C++构造函数

构造函数的作用 在创建一个新的对象时,自动调用的函数,用来进行“初始化”工作: 对这个对象内部的数据成员进行初始化。 构造函数的特点 自动调用(在创建新对象时,自动调用)构造函数的函数名,和类名相同构造函数没有返回类型可以有多个构造函数(即函数重载形式)   构造函数的种类 默认构造函数 自定义的构造函数 拷贝构造函数 赋值构造函数 默认构造函数 没有参数的构造函数

第二百一十二节 Java反射 - Java构造函数反射

Java反射 - Java构造函数反射 以下四种方法来自 Class 类获取有关构造函数的信息: Constructor[] getConstructors()Constructor[] getDeclaredConstructors()Constructor<T> getConstructor(Class... parameterTypes)Constructor<T> ge

第七章 构造函数this静态单例模式

7.1 构造函数 构造函数与类名相同,无返回值。 类中未定义构造函数时,默认使用空参构造函数。 7.2 关键字this 使用this可增强代码的可读性 成员变量与局部变量同名时,this.var指当前对象的成员变量。函数中指此函数所在的对象。 7.3 关键字static 可用来修饰成员遍历和函数。 成员被该类所有对象所共享 内存中存在方法区,因此优先于对象存在。 可

类实例化和构造函数

类实例化和构造函数 类如何创立,如何调用构造函数源码rv汇编行为分析 一般成员函数虚函数源码汇编行为分析 纯虚函数汇编行为分析 多态源码汇编行为分析 为什么构造函数不能是虚函数 类如何创立,如何调用构造函数 源码 #include <iostream>using namespace std;// 抽象父类class Base {int a,b;public:Base(){

Spring一个类包含多个构造函数且带的参数相同所存在的注入类型问题

在Spring框架中,当一个类包含多个构造函数带的参数相同,它总是会造成构造函数注入参数类型歧义的问题。 看如下一个代码: public class Student {           private String name ;      private String address ;      private int age ;