【校招面试 之 C++】第4题 拷贝构造函数被调用的3个时机

1、被调用的3个时机:

(1)直接初始化或拷贝初始化;

(2)将一个对象作为一个实参传递,形参采用非指针或非引用的对象进行接收时;

(3)函数的返回值是一个非指针或者非对象被接收时。

2、举例说明:

#include <iostream>
using namespace std;

class Test{
private:
	int a;
	int b;
	static int count;
public:
	Test(int i, int j): a(i), b(j){}
	void print();
	Test(Test &t);
	void fun(Test t);
	Test fun1();
};
int Test::count = 1;
void Test::print(){
	cout<<"a = "<<a<<" b = "<<b<<endl;
}

Test::Test(Test & t){
	cout<<"第"<<count++<<"次拷贝构造函数被调用! "<<endl;
	this->a = t.a;
	this->b = t.b;
}

void Test::fun(Test t){										// 关于情形2 需要注意的是:形参不能是引用或者不能是指针的对象
	cout<<"a = "<<t.a<<" b = "<<t.b<<endl;
}

Test Test::fun1(){												// 关于情形3 需要注意的是:返回类型不能是引用或者不能是指针的对象
	this->a = this ->a ++;
	this->b = this->b ++;
	return *this;
}

int main(int argc, char*argv[])
{
        Test t(1,2);
	 // 调用拷贝构造函数 情形1
	 Test t1(t);
	 // 调用拷贝构造函数 情形2
	 t1.fun(t);
	  t.print();
	 // 调用拷贝构造函数 情形3
	 Test t3 = t1.fun1();		// 注意这种情况不会调用重载赋值操作符   Test t; t = t1这种情况的赋值运算符是会被重载的
	 t3.print();

	 system("pause");
     return 0;
}

输出结果:

原文地址:https://www.cnblogs.com/xuelisheng/p/9330930.html

时间: 2024-07-31 01:10:47

【校招面试 之 C++】第4题 拷贝构造函数被调用的3个时机的相关文章

C++拷贝构造函数的调用时机

一.拷贝构造函数调用的时机 ? 当以拷贝的方式初始化对象时会调用拷贝构造函数,这里需要注意两个关键点,分别是以拷贝的方式和初始化对象 1. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填充数据,这个过程会调用构造函数,对象被创建后必须立即初始化.也就是说只要创建对象就会调用构造函数. 2.初始化和赋值的区别 初始化和赋值都是将数据写入内存中,从表面看,初始化在很多时候都是以复制的方式来实现的,很容易引起混淆.在定义的同时进行复制叫做初始化,定义完成以后再赋值(不管定义的时候有没有赋

【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解

c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3977861.html 一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream

c++拷贝构造函数(深拷贝,浅拷贝)详解

一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream> using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) { a=b; printf("con

C++的拷贝构造函数

1?  类会提供默认的拷贝构造函数 –默认的拷贝构造函数会完成所有成员的逐个复制 2?  拷贝构造的调用时机: –函数值传递时 –函数返回时 –用同类型的对象初始时 3?  何时需要自定义拷贝构造函数? –类中有指针(或引用 )成员时 –希望自定义对象的拷贝过程时 4?  使用匿名对象简化编程 // // main.cpp // 拷贝构造函数 // // Created by 06 on 15/1/26. // Copyright (c) 2015年 黄永锐. All rights reserv

C++中拷贝构造函数和赋值函数被调用的时机

一.拷贝构造函数被调用的时机: 1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值. 2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数. 3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数. 二.赋值函数被调用的时机: 当用一个对象赋值给另一个对象时 注意一.二中初始化和赋值的区别 C++中拷贝构造函数和赋值函数被调用的时机,布布扣,bubuko.com

[QT入门篇]3 QObject的拷贝构造函数与赋值运算符

本文主要是针对QObject的拷贝构造函数和赋值运算符进行说明.先来看一下拷贝构造函数定义:拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化.其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制.此函数经常用在函数调用时用户定义类型的值传递及返回.拷贝构造函数要调用基类的拷贝构造函数和成员函数.如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用. 还记得<[QT入门篇]1 QT中的对象模型>中

C++中构造函数,拷贝构造函数,析构函数

C++中默认构造函数就是没有形参的构造函数.准确的说法,按照<C++ Primer>中定义:只要定义一个对象时没有提供初始化式,就是用默认构造函数.为所有 的形参提供默认实参的构造函数也定义了默认构造函数. 合成的默认构造函数,即编译器自动生成的默认构造函数.<C++ Primer>中的说明:一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数.这条规则的根据是,如果一个类再某种情况下需要控制对象初始化,则该类很可能在所有情况下都需要控制.只有当一个类没有定义构造函数时,

C++知识点:拷贝构造函数例子

//拷贝构造函数: //函数参数传递时调用一次拷贝构造函数,给对象赋值时调用一次拷贝构造函数,对象作为参数传递后会被及时销毁. #include <fstream> #include <string> using namespace std; ofstream out("HowMany2.out"); class HowMany2 { string name;//object identifier static int objectCount; public:

【C/C++学院】(6)构造函数/析构函数/拷贝构造函数/深copy浅copy

1.构造函数 类的初始化即为构造函数.也为:隐式的初始化. 构造函数在对象初始化的时候,自动被调用.隐式的调用. 构造函数分为三种:有参构造函数.无参构造函数.拷贝构造函数. 有参构造函数调用有三种:括号法.等号法.手工法. #include <iostream> using namespace std; class Test { private: int m_a; public: Test()//无参构造函数 { } Test(const Test &obj)//拷贝构造函数 { }