初始化数组/容器时,调用默认构造函数还是复制构造函数

当使用数组或容器时,通常会预先分配一定容量。在分配的大小中,都会初始化容器的对象,在初始化第一个时,毫无疑问调用的是默认构造函数,但是当初始化第二个到最后一个时,应该怎么做?

很显然,数组/容器的对象都一模一样,一种方法是:开辟内存,然后在开辟的内存处调用默认构造函数;另一种方法是:开辟内存,构造一个对象,把对象拷贝n份到开辟的内存处(调用复制构造函数)。从效率上来说,我认为第二种效率更高,因为调用默认构造的消耗一般大于调用复制构造函数。复制构造函数常常是浅拷贝,这样效率很高。

写代码测试一下,首先我使用的是VS2010,容器也是VS自带的。

#include<iostream>
#include<vector>
class Test
{
public:
	Test()
	{
		std::cout << "Ctor" << std::endl;
	}
	Test(const Test& T)
	{
		std::cout << "Cptor" << std::endl;
	}
};
int main()
{
	std::cout << "容器" << std::endl;
	std::vector<Test> V(3);
	std::cout << "数组" << std::endl;
	Test T[3];

	return 0;
}

结果为:

容器

Ctor

Ctor

Ctor

数组

Ctor

Ctor

Ctor

很显然是第一种办法。

之后容器使用SGI版的STL5.2(就是把头文件vector改为SGI版本的)

输出结果为:

容器

Ctor

Cptor

Cptor

Cptor

数组

Ctor

Ctor

Ctor

显然,容器使用的是第二种方法。

可以再vector的源代码中看到调用过程

explicit vector(size_type n) { fill_initialize(n, T()); }

它调用了默认构造函数一次,之后拷贝n次.

时间: 2025-01-13 22:35:33

初始化数组/容器时,调用默认构造函数还是复制构造函数的相关文章

C++结构体:默认构造函数,复制构造函数,重载=运算符

做leetcode的时候经常看到有结构体的默认构造函数,觉得很奇怪,才发现原来c++的结构体与c语言的结构体不一样,c++的结构体更像是一个类, C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就需要实现上述三个函数,否则就只能用指针了. 转:http://blog.csdn.net/fu_zk/article/details/10539705 #

关于C++类中的土著民:构造函数,复制构造函数,析构函数

我们初学C++时可能会对类的构造函数,复制构造函数,析构函数有点疑问.整理如下(个人见解,如有错误,还望指正.): 1.构造函数 根据构造函数的定义知它的作用是初始化类的数据成员或内嵌类的对象,所以它的参数表就应该是它要初始化的对象类型.构造函数分三类:默认构造函数.构造函数.委托构造函数. 默认构造函数 默认构造函数没有返回值,没有参数表,没有函数体,如果类内没有显式的定义构造函数,系统会自动生成默认构造函数,如果已经定义了构造函数,但仍需要默认构造函数,可以在默认构造函数参数表后加defau

没有可用的复制构造函数或复制构造函数声明为“explicit”

       c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\vector(810) : error C2558: struct"ST_WINDPOWER_HIS_THREEWATERFALL_OUT" : 没有可用的复制构造函数或复制构造函数声明为"explicit"         c:\Program Files\Microsoft Visual Studio .NET 2003\V

复制构造函数(拷贝构造函数)

也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生.对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么用,其实复制构造函数能解决一些我们常常会忽略的问题. 为了说明复制构造函数作用,我先说说我们在编程时会遇到的一些问题.对于C++中的函数,我们应该很熟悉了,因为平常经常使用:对于类的对象,我们也很熟悉,因为我们也经常写各种各样的类,使用各种各样的对象:对于指针的操作,我们也不陌生吧?嗯,如果你还不

C++的简单总结(复制构造函数,深拷贝,前拷贝,默认属性)

类的三大属性: private,public,protected 1,对于类的成员变量或者函数,缺省即为私有 #include <iostream> using namespace std; class A { int y; //私有成员 int x; //私有成员 public: A(int xx, int yy) {x = xx; y = yy;} void setx(int m) {x = m;} void sety(int n) {y = n;} }; int main() { A a

C++中复制构造函数被调用的三种情况

C++中的构造函数 c++中的构造函数分为构造函数,和复制构造函数,相比于构造函数,复制构造函数使用更加方便,快捷.构造函数可以有多个,二复制构造函数只能有一个,因为复制构造函数的参数只能是当前类的一个对象,参数表是固定的,无法重载,若用户没有定义自己的辅助构造函数,系统会自动生成一个复制构造函数,其作用是将参数的之赋予当前的对象.若用户自己定义了复制构造函数,系统则不会生成默认复制构造函数.用户自己定义的复制构造函数功能可以自己构造,不一定执行复制的功能. 复制构造函数同构造函数的功能大体相同

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

笔记十:复制构造函数、深拷贝、浅拷贝

复制构造函数 定义: 只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数.复制构造函数可用于: 1.根据另一个同类型的对象显示或隐式初始化一个对象 2.复制一个对象,将它作为实参传递给一个函数 3.从函数返回时复制一个对象 4.初始化顺序容器中的元素 5.根据元素初始化列表初始化数组元素 --以上定义来自<C++ Primer 中文版 第4版> 浅拷贝/浅复制 第一条中,若一个自定义类对象已经初始化了,并且用该类去初始化另一个同类类型的对象,假

【C/C++】复制构造函数、深复制浅复制

常见问题 Q1. 下面代码的输出结果是( )? 1 #include <iostream> 2 using namespace std; 3 4 class MyClass 5 { 6 public: 7 MyClass(int n) { number = n; } 8 MyClass(const MyClass &other) 9 { 10 number = other.number; 11 cout << "a "; 12 } 13 private: