C++类构造优化 - 不调用拷贝构造函数

假如有下面这样一个类:

class A{
public:
  A(int p, char q):x(p), c(q){ cout << "constructor called" << endl; }
  A(const A& a){x = a.x; c = a.c; cout << "copy constructor called" << endl;}
  ~A(){cout << "destructor called" << endl;}
private:
  int x;
  char c;
};

如果按照下面的语句生成对象a:


A a = A(1,'a');

按照预想会先调用自定义构造函数生成临时对象,而后调用拷贝构造函数,最后会发生两次析构。

但是,实际上上述代码经优化后只调用构造函数A(int,char),并不调用拷贝函数,而且只发生一次析构。

即A a = A(1,‘a‘);与A a(1,‘a‘);是等价的。

时间: 2024-12-14 18:48:23

C++类构造优化 - 不调用拷贝构造函数的相关文章

以一个类成员函数来说明拷贝构造函数与析构函数何时调用

mystring operator +(const char *str, const mystring &it) { mystring stro; strcpy(stro.s, str); strcat(stro.s, it.s); printf("stro = %p\n", stro.s); return stro; } 当return stro时,其实返回的是stro的一个副本.这时就会调用拷贝构造函数.副本stro其实是在为外部使用作准备.会后于原始stro销毁. 接着,

C++什么时候调用拷贝构造函数和什么时候调用构造函数

拷贝构造函数 都是在什么情况下调用??? /* ** 什么时候调用拷贝构造函数 ** */ #include <iostream> using namespace std; //日期类 class Date{ public: int year,month,day; Date(){//无参构造 cout << "日期类的构造函数" << endl; } ~Date(){ cout << "日期的析构函数" <<

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: #include <iostream>  using namespace std;    class Test  {  public:      Test(int temp)      {          p1=temp;      }  prote

利用无名对象初始化对象系统不会调用拷贝构造函数

#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) { cout<<"载入构造函数"<<endl; strcpy(Internet::name,name); } Internet(Internet &temp) { cout<<"载入COPY构造函数"<&l

C++ 函数返回对象时并没有调用拷贝构造函数

#include <iostream> #include <vector> #include <string.h> using namespace std; class CTest { public: CTest() { cout << "CTest construct" << endl; data = new char[10]; strncpy(data, "hello", 10); } CTest(co

string类的写时才拷贝(Copy-On-Write)

写时才拷贝(Copy-On-Write)的原理是什么? Copy-On-Write,其实是使用了一个计数器.当第一个类构造时,计数器初始值为1,string类的构造函数会根据传入的参数从堆上分配内存,当其他类需要这块内存时,这个计数器自动累加.当有析构函数时,这个计数器会减1,直到当计数器为1时,即最后一个类析构.此时,程序才会真正的delete这块从堆上分配的内存. 2.  string在什么情况下会发生写时才拷贝(Copy-On-Write)? 当string类中发生内存共享且内容发生改变时

C++基础3 类:构造 拷贝 析构函数,

为什么会出现构造函数 与 析构函数 [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; class Test { public: void init() { a = 1; b = 2; } private: int a; int b; }; int main() { Test arr[

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程: