随笔 - 30, 文章 - 0, 评论 - 64, 引用 - 0
数据加载中……

定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数

实际上,当我们定义一个class而没有明确定义构造函数的时候,


编译器会自动假设两个重载的构造函数
 (默认构造函数"default constructor" 和复制构造函数"copy constructor")。


例如,对以下class:

   class CExample {
public:
int a,b,c;
void multiply (int n, int m) { a=n; b=m; c=a*b; };
};

没有定义构造函数,


编译器自动假设它有以下constructor 成员函数:

  • Empty constructor

    它是一个没有任何参数的构造函数,被定义为nop (没有语句)。它什么都不做。

    CExample::CExample () { };
  • Copy constructor

    它是一个只有一个参数的构造函数,该参数是这个class的一个对象,这个函数的功能是将被传入的对象(object)的所有非静态(non-static)成员变量的值都复制给自身这个object。

       CExample::CExample (const CExample& rv) {
    a=rv.a; b=rv.b; c=rv.c;
    }

必须注意:这两个默认构造函数(empty construction 和 copy constructor )

只有在没有其它构造函数被明确定义的情况下才存在。

如果任何其它有任意参数的构造函数被定义了,这两个构造函数就都不存在了。

在这种情况下,

如果你想要有empty construction 和 copy constructor ,

就必需要自己定义它们。

posted on 2008-12-04 18:04 henry08 阅读(2075) 评论(5)  编辑 收藏 引用 所属分类: C++

评论

# re: 定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数  回复  更多评论   

构造函数和拷贝构造函数不是一回事.

你有带参数的构造函数,如果没有声明拷贝构造函数,系统还是会生成拷贝构造函数的. 系统生成的拷贝构造函数可能是按位拷贝的 - -
2008-12-04 21:04 | jmchxy

# re: 定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数[未登录]  回复  更多评论   

@jmchxy
按成员递归复制。不是按位复制。
其他同意你的观点。
2008-12-05 07:59 | raof01

# re: 定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数  回复  更多评论   

Empty constructor

它是一个没有任何参数的构造函数,被定义为nop (没有语句)。它什么都不做。

他并不是什么都不做。
试试
CExample* p1 = new CExample;
CExample* p2 = new CExample();
查一下两种调用后a, b, c的值
2008-12-05 23:39 | wishsaler

# re: 定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数[未登录]  回复  更多评论   

上机设计题目:
编写一个学生类(至少包含3个成员)要求包括:
1.构造函数,析构函数,输出函数.
2.静态的成员及成员函数
3.写出main函数,要求至少产生3个对象,并输出相应的内容.#include<iostream.h>#include<string.h>
帮我做了好吗?
2008-12-06 18:59 | 李宏鑫

# re: 定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数  回复  更多评论   

按成员递归复制。不是按位复制
2008-12-13 18:06 | 戴尔笔记本

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理