首页 > 编程语言 >C++ 直接初始化和拷贝初始化

C++ 直接初始化和拷贝初始化

时间:2023-03-25 22:11:27浏览次数:50  
标签:初始化 C++ a2 a4 拷贝 直接 构造函数

首先我们介绍直接初始化编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。文字描述可能会让你们云里雾里,那我们直接看代码:

//先设计这样的一个类
class A{
public:
    A(){ cout << "A()" << endl; }
    A(int a){ cout << "A(int a)" << endl; }
    A(const A&){ cout << "A(const A&)" << endl; }
};
A a1(10);           //直接初始化
A a2(a1);           //直接初始化

结果为:

A(int a)
A(const A&)

通过上述的例子,我们可以发现直接初始化其实就是根据传入的参数选择最匹配的构造函数来进行初始化。但是其中有一个误区需要指出:直接初始化有可能调用拷贝构造函数!!!不能因为直接初始化不是拷贝初始化,就想当然认为其不可能调用拷贝构造函数。

接下来,让我们再看看拷贝初始化

A a3 = a2;                  //拷贝初始化1
A a4 = 2;                   //拷贝初始化2
A a5 = A(3);                //拷贝初始化3

 结果为:

A(const A&)
A(int a)
A(int a)

上面介绍了在用=定义变量时发生的拷贝初始化,让我们仔细地来分析一下: 

  • 第1种情况:很好理解,是用a2去初始化a3,其实是A a3(a2);所以本次拷贝初始化是用了拷贝构造函数。

  • 第2种情况:其实是相当于进行了两步:
    • A a4 = A(2);这一步称之为隐式类型转化。
    • A a4(A(2));其实也是调用了拷贝构造函数。
    • 但需要注意的是:有的编译器会做一定的优化,即在vs2013环境下,会将该种情况直接变为A a4(2);
  • 第3种情况:其实就是A a5(A(3));同样在vs2013环境下会被优化为A a5(3);

拷贝构造初始除了用等号定义的情况,还有以下几种情况:

  • 将一个对象作为实参传递给一个非引用类型的形参

  void test(A a);

  • 从一个返回类型为非引用类型的函数返回一个对象

  return A test();

  • 花括号列表初始化一个数组中的元素或一个聚合类中的成员

  string str[2]{"lll","ttt"};

某些类类型还会对他们所分配的对象使用拷贝初始化。如vector调用其insert或push成员。

 

参考资料:

C++ 直接初始化和拷贝初始化_twdlll的博客-CSDN博客

标签:初始化,C++,a2,a4,拷贝,直接,构造函数
From: https://www.cnblogs.com/xzit201802/p/17255743.html

相关文章

  • C++ STL摘记
    一、string类补充1.函数示例:(1)find和rfind函数,返回的是下标或者string::nposindex=ss.find(s1,pos,num)find从pos(包括)开始往右查找(num的作用待补充)index=s......
  • C/C++保安值班安排系统[2023-03-25]
    C/C++保安值班安排系统[2023-03-25]题目十五:保安值班安排系统问题描述:某公司有7名保安人员,由于工作需要进行轮休制度,一星期中每人休息一天。预先让每一个人选择自己认为......
  • C++命名规范
    C++命名规范共用准则只能是字母(A-Z,a-z)、数字(0-9)和下划线(_)组成,区分大小写文件、函数、类、变量名应当具有描述性类、自定义类型和变量名应当使用名词,函数名使用......
  • 面试高频问题之C++编译过程
    C++编译过程C++是一种高级编程语言,但是计算机并不能直接理解它。因此,需要将C++代码翻译成计算机可以理解的机器语言。这个过程就是编译过程,是C++程序从源代码到可执行文件......
  • 面试高频问题之C++编译过程
    C++编译过程C++是一种高级编程语言,但是计算机并不能直接理解它。因此,需要将C++代码翻译成计算机可以理解的机器语言。这个过程就是编译过程,是C++程序从源代码到可执行文件......
  • 设计模式之单例模式C++实现
    初步用C++实现单例模式,暂未考虑线程安全问题#include<stdio.h>#include<iostream>usingstd::cout;usingstd::cin;usingstd::endl;//单例模式的设计需求:一个......
  • C++ 用户自定义字面量(operator"" _)
    目录字面量自定义字面量定义容量字面量定义时间字面量参考字面量字面量是指源码中,固定的常量。比如,constchar*p="abcd";conststd::strings="efg";constintv......
  • C++ 2023年计算机学院”新生杯“ACM天梯赛周赛(一) 二进制转化的感悟
    题目描述对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:0000000001000100001100100请按从小到大的顺序输出这32种01......
  • 返回值优化-消除拷贝
    我们使用gcc编译器,C++11,《c++核心指南》的一个条款:“For“out”outputvalues,preferreturnvaluestooutputparameters”:在函数输出数值时,尽量使用返回值而非输出......
  • c++ linux 编译 静态库 ,动态库
                        一起编译:  静态路径要用全路径    静态编译       规范写法  ......