C++ constructor 初始化对象成员最高效的做法

#include <iostream>
#include <utility>
using namespace std;
class A{
private:
    int data;//data
    int *pi;//point to data
public:
    //禁止隐式转换
    A(){
        data = 0;
        pi = &data;
    }
    ~A(){
        data = -999999;
        pi = nullptr;
    }

explicit A(int i) :data(i){
        cout << "normal constuctor!" << endl;
        pi = &data;
    }
    A(const A &a){
        data = a.data;
        cout << "copy constructor!" << endl;
        pi = &data;
    }

A(A &&a){
        cout << "move constructor!" << endl;
        //直接移动a.pi到pi
        pi = a.pi;
        data = a.data; //修改源pi
        a.pi = nullptr;
        a.data = 0;
    }

A operator+(const A &a){
        A temp(data + a.data);
        cout << endl << "operator+ called!show temp!" << endl;
        temp.show();
        cout << endl;
        return temp;
    }
    void show()const{
        cout << "pi=" << pi << "   data=" << data << endl;
    }
};

class B
{
private:
    A _a;
public:
//    B(A aa) :_a(aa){
//    }//到这里时,  aa 和 _a仍然存在!! aa浪费了, 白死了!

//************************         最高效        ***********************************
    B(const A& aa) :_a(aa){
    }//利用main中的a复制构造_a, 毫无浪费
    //*********************             最高效       *****************************

//    B(A aa){
//        _a = std::move(aa);//_a白白构造了一遍!
//    }

~B(){}

};

//vs可以像Eclipse一样按Tab键!!!!!!!
int main()
{
    int i = 99;
    A a(10);
    B b(a);//复制构造a
}

我本来猜想会有move constructor的编译器优化, 不过const &也可以避免多余的构造函数调用, 我想多了

时间: 2024-12-08 00:11:55

C++ constructor 初始化对象成员最高效的做法的相关文章

C++之对象成员指针

对象成员指针:对象的指针作为另外一个类的成员 对象成员指针既可以用初始化列表进行初始化,也可以使用普通构造函数进行初始化 对象成员指针常见的初始化方式和销毁方式 原文地址:https://www.cnblogs.com/xjyxp/p/11238760.html

c++类 用冒号初始化对象(成员初始化列表)

c++类 用冒号初始化对象(成员初始化列表) 成员初始化的顺序不同于它们在构造函数初始化列表中的顺序,而与它们在类定义中的顺序相同 #include<iostream> int n=0; using namespace std; class Cbox{ int a ; int b ; int c ; public: int g ; Cbox():a(n++),c(n++),b(n++){} ~Cbox(){cout<<a<<" "<<b&

对象成员

--------------siwuxie095 对象成员 在对象中包含其它对象是一种非常普遍的现象 以坐标系中的线段为例:说明对象成员的定义和使用方法 如果要定义一个如上图所示的线段类,每条线段都由两个点连接而形成, 这意味着,需要定义一个表示点的类,该点类包含横坐标和纵坐标,而 线段类包含两个坐标对象 可见,要描述清楚这个数学问题,至少要定义两个类:一个定义坐标的 点,另一个定义点上的线段 坐标类:Coordinate 线段类:Line 定义完成后,通过实例化来描述一条线段: 当实例化 Li

C++初始化数据成员

在C++初始化类的成员数据有两种方式1. 在构造函数中实现 2. 定义初始化成员列表来初始化成员数据 class point { private: int x,y; public: point(int m,int n) { x=m; y=n; } }; class point { private: int x,y; public: point(int m=0,int n=0):x(m),y(n){} }; 这两种初始化成员数据方式有差别,用构造函数初始化成员数据其实就是用赋值来实现,用初始化成员

iOS开发学习笔记-创建和初始化对象

Objective-C中对象的创建和初始化(Allocating and Initializing Objects)(主要内容来自于Apple的电子书<The Objective-C Programming Language>的“Allocating and Initializing Objects”.电子书可以从iBooks商店下载.iOS Developer Library也有同名的文档,但是内容上是不同的.) 在Objective-C中创建对象分为两步:1 开辟一个对象所需的内存,All

C++学习笔记17,构造函数体内初始化数据成员与构造函数初始化器的区别(一)

在构造体内初始化数据成员是最常见的方法. 例如: #include <iostream> using namespace std; class A { private: int i; string s; public: A(int ii,string ss){ //在构造函数体内初始化数据成员 i=ii; s=ss; cout<<"ctor:i="<<i<<",s="<<s<<endl; } /

MFC 调用默认对话框类对象成员和方法

这个功能其实并不常用,然而在多线程和回调函数中要调用默认对话框类的对象成员或方法还是可能要用到的,所以做下记录. 首先声明一个全局变量用以存储默认对话框类对象指针: LPVOID pParam;//对话框对象指针 在默认对话框类的初始化函数中给该指针进行赋值: pParam = (void *)this; 在需要调用默认对话框类对象成员或方法处,通过如下代码实现调用: CPanoramicPlayerDlg *dlg = (CPanoramicPlayerDlg *)lpParam;//其中CP

创建对象,初始化对象属性,给节点分派一个合成事件

XML DOM createEvent() 方法 Document 对象参考手册 定义和用法 createEvent() 方法创建新的 Event 对象. 语法: createEvent(eventType) 参数 描述 eventType 想获取的 Event 对象的事件模块名. 关于有效的事件类型列表,请参阅“说明”部分. 返回值 返回新创建的 Event 对象,具有指定的类型. 抛出 如果实现支持需要的事件类型,该方法将抛出代码为 NOT_SUPPORTED_ERR 的 DOMExcept

C++对象模型对象成员的效率 (Object Mem ber Efficiency)(第三章) .

3.5 对象成员的效率 (Object Mem ber Efficiency) 下面某个测试,目的在测试聚合(aggregation).封装(encapsulation),以及继承(Inheritance)所引发的额外负荷的程度.所有测试都是以个别局部变量的加法,减法,赋值(assign)等操作的存取成本为依据.下面就是个别的局部变量: float pA_x = 1.725, pA_y = 0.875, pA_z = 0.478; float pB_x = 0.315, pB_y = 0.317