`
vanillalyx
  • 浏览: 64616 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

对象的声明,类的构造函数和拷贝构造函数何时调用

阅读更多
\

class Point  
{
public:
	Point(int x=0,int y=0 );
	Point(Point&);
	virtual ~Point();
	int x,y;

};
// Point.cpp: implementation of the Point class.
//
//////////////////////////////////////////////////////////////////////

#include "Point.h"
#include <stdio.h>
#include <iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Point::Point(int x,int y)
{
	this->x = x;
	this->y = y;
	cout<<"构造函数被调用"<<endl;
}
Point::Point(Point& p)
{
	this->x = p.x;
	this->y = p.y;
	cout<<"拷贝构造函数被调用"<<endl;
}

Point::~Point()
{

}

class Test  
{
public:
	Test(int,char*,int,Point);
	Test(Test&);
	virtual ~Test();
	
	void setPoint(Point);
private:
	Point p1;
	const int a;
	int id;
	char* name;
	static int count;

};

Test::Test(int id,char* name,int a,Point p):a(a) //
{	
	//到这里,会调用Point的构造函数,p1会先声明
	this->p1 = p;
	this->id = id;
	this->name = new char[strlen(name)+1]; //Ï
	if(this->name!=0)
		strcpy(this->name,name);
}
Test::Test(Test& t):a(t.a) 
	//到这里,会调用Point的构造函数,p1会先声明
	p1 = t.p1; 
	id = t.id;
	name = new char[strlen(t.name)+1]; 
	if(name!=0)
		strcpy(name,t.name);
	cout<<"test"<<endl;
}
Test::~Test()
{

}
int Test::count = 10;

void Test::setPoint(Point p)
{

	//在这里拷贝构造函数被调用,因为p1已经被声明过了

	this->p1 = p; 
}

void main()
{
	 cout<<"*********************"<<endl;
    Point pp(1,1); //构造函数被调用
    Point pp2; //构造函数被调用,而且必须有默认构造函数,可以使用无参数初始化,Point(int x=0,int y=0)或者Point()
    cout<<"8888888"<<endl;
    pp2 = pp; //不再调用
    Point pp3 = pp; //拷贝函数被调用

}


分享到:
评论
1 楼 vanillalyx 2009-03-11  
普通构造函数是在对象创建时

拷贝函数使用的三种情况:

用类的一个对象去初始化该类的另一个对象
student s1 = s2;
函数的形参是类的对象
void fun(student fs)
{}

如果函数的返回值是类的对象

相关推荐

    C++ 课程作业 类与对象2——构造函数、拷贝构造函数、析构函数(计算两个日期间的天数)

    3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用” 4、请设计一个析构函数,同时输出“析构函数被调用” 5、设计一个成员函数 int dayDiff(CTime t) ,用于计算...

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

    如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。 自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造...

    C++规定与类同名的函数就是拷贝构造函数

    类的基本特性包括构造函数和拷贝构造函数,其中构造函数用于初始化新创建的对象,而拷贝构造函数则用于复制对象。静态成员是属于类而非类的特定实例的,它们可以被所有对象共享,且可以被静态成员函数访问。友元机制...

    C++有子对象的派生类的构造函数

    2. 显式构造函数调用:可以使用成员初始化列表(member initialization list)来指定子对象的构造函数,并传递参数。这种方式可以提高效率,因为避免了默认构造后再赋值的额外开销。 三、派生类构造函数 1. 继承...

    构造函数和析构函数PPT课件.pptx

    3. 每个类都有各自的拷贝构造函数,其格式如下所示:&lt;类名&gt;::&lt;类名&gt;(&lt;类名&gt;&对象名) 4. 如果类中没有说明拷贝构造函数,则编译系统自动生成一个具默认值的拷贝构造函数。 析构函数是与构造函数相对应的函数,它是...

    有关c ++的题目,关于构造函数和拷贝构造函数的知识点

    在实际应用中,为了确保对象的正确初始化和复制,建议显式地定义构造函数和拷贝构造函数。例如,对于`employee`类,可以这样定义: ```cpp class employee { private: char name[20]; char address[20]; char ...

    拷贝构造函数..........

    拷贝构造函数的声明一般形如 `ClassName::ClassName(const ClassName &obj)`,其中 `ClassName` 是类名,`obj` 是传入的对象引用。拷贝构造函数接受一个同类型的对象的引用作为参数,并且通常将这个对象的数据成员...

    没有可用的复制构造函数或复制构造函数声明

    在C++编程中,"没有可用的复制构造函数或复制构造函数声明"是一个常见的错误,通常出现在尝试复制一个对象,而该对象的类没有定义复制构造函数时。在这个特定的情境中,问题出在一个名为`CArray, int&gt;`的自定义数组...

    析构或构造函数声明为保护或私有成员

    在上面的代码中,类 A 的拷贝构造函数和 operator=(赋值操作符重载)被声明为私有成员,以禁止外部用户对对象进行复制动作。 将构造函数和析构函数声明为私有或保护成员是一种常用的设计模式,可以用于实现 ...

    不要轻视拷贝构造函数与赋值函数

    - 调用时机:当创建新对象时,如果该对象的初始化需要一个同类型对象作为参数,则会调用拷贝构造函数。 - 示例:`String c(a);` 2. **赋值函数(赋值运算符重载)**: - 定义:赋值函数允许现有对象接收另一个...

    c++之十引用和拷贝构造函数

    拷贝构造函数是类的一个特殊构造函数,当一个对象被用作另一个新对象的初始值时调用。它的形式通常是这样的: ```cpp ClassName(const ClassName& obj); ``` 这个构造函数接受一个同类型的const引用作为参数,用于...

    c++ 类与对象课件,包括对象的初始化,对象的使用,构造函数和析构函数等等

    拷贝构造函数是另一个重要的构造函数,用于创建一个对象的副本。浅拷贝(Shallow Copy)仅仅复制对象的数据成员的值,而不复制动态分配的内存,可能导致两个对象共享同一块内存,改变一个对象会影响到另一个。深拷贝...

    为什么构造函数不能是虚函数

    - 这是因为构造函数调用的顺序是从基类到派生类,而在构造函数中调用虚函数时,虚拟表(VTable)中的指针还未被更新为最终派生类的版本,导致调用的总是当前类的函数。 4. **潜在的安全问题** - 如果允许在构造函数...

    C++编程思想--引用和拷贝构造函数

    在C++编程中,引用(Reference)和拷贝构造函数(Copy Constructor)是两个关键概念,它们对于理解和编写高效、安全的代码至关重要。 引用是一种特殊类型的变量,它并不占用额外的存储空间,而是作为现有对象的别名...

    关于拷贝构造函数和赋值函数.txt

    在C++编程语言中,拷贝构造函数和赋值操作符是两个非常重要的概念,它们主要用于处理类的对象之间数据的复制问题。下面将对这两个概念进行详细介绍。 ### 拷贝构造函数 拷贝构造函数是一种特殊的构造函数,它用于...

    C++构造函数和析构函数的调用顺序1

    在C++编程中,构造函数和析构函数是类的重要组成部分,它们负责对象的初始化和清理工作。本文将深入探讨这两个函数的调用顺序,并通过一个具体的例子来演示这一过程。 1. **构造函数的调用顺序**: 当创建一个对象...

    拷贝构造函数和赋值操作符号的重载.docx

    当使用等号操作符(`=`)在声明时初始化对象或者将对象作为函数参数传递时,拷贝构造函数会被调用。对于包含动态分配内存的类,如果不自定义拷贝构造函数,那么默认的浅复制行为可能导致两个对象共享同一块内存资源...

    构造函数和析构函数习题.pdf

    10. 该类的拷贝构造函数的声明语句为 AB(AB& x)。 11. C++ 中不能被派生类继承的是析构函数。 12. L 行说明了一个对象 q。 13. 不属于构造函数的特点是带返回值。 14. 属于析构函数特征的是析构函数名前必须冠以...

    C++构造函数详解及显式调用构造函数.doc

    当我们创建一个类的实例时,构造函数会被自动调用,确保对象在使用前处于正确的初始状态。下面将详细解释构造函数的种类及其作用。 1. 无参数构造函数:这是编译系统默认提供的一种构造函数,如果类中没有定义任何...

    C++构造函数,复制构造函数和析构函数专题[1].pdf

    在C++编程语言中,构造函数、复制构造函数和析构函数是面向对象特性的重要组成部分,它们在对象的生命周期管理中扮演着至关重要的角色。同时,继承、虚函数和多态性是C++实现面向对象设计的核心概念。下面将详细讨论...

Global site tag (gtag.js) - Google Analytics