const总结
继承与派生

构造函数

yichen posted @ 2014年2月23日 15:29 in Essay , 483 阅读

1

1

1

1

1.默认构造函数,<类名>(){<必须对数据成员进行初始化>};与<类名>(<带默认值的全部数据成员>);是一样的,二者只能取其一。另外,构造函数中的参数名与类中数据成员名尽量不要相同。如若相同需要用到this指针。

2.全部带默认参数的构造函数,必须对每一个数据成员提供默认参数值。这样可以如此声明:Member m;当定义了全部带默认参数的构造函数时就不能再定义默认的构造函数。Member(){};

3.默认构造函数是一个无参构造函数,它仅负责创建对象,不做任何初始化工作,这样类中数据成员的值是不定的(当类对象被定义在局部域中,若是全局域,则类中数据成员被系统初始化),只要类定义了一个构造函数,系统就不提供默认构造函数。

 

构造函数不能声明为 const,const 构造函数是不必要的。创建类类型的 const 对象时,运行一个普通
构造函数来初始化该 const 对象。构造函数的工作是初始化对象。不管对象是
否为 const,都用一个构造函数来初始化化该对象。从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2)
普通的计算阶段。计算阶段由构造函数函数体中的所有语句组成。
不管成员是否在构造函数初始化列表中显式初始化,类类型的
数据成员总是在初始化阶段初始化。初始化发生在计算阶段开
始之前。没有默认
构造函数的类类型的成员,以及 const 或引用类型的成员,不
管是哪种类型,都必须在构造函数初始化列表中进行初始化。记住,可以初始化 const 对象或引用类型的对象,但不能对它们赋值,在
开始执行构造函数的函数体之前,要完成初始化。初始化 const 或引用类型数
据成员的唯一机会是构造函数初始化列表中.

使用构造函数初始化列表:必须对任何 const 或引用类型成员以及没有默认构造
函数的类类型的任何成员使用初始化式。

 

考虑下面的类:
class X {
int i;
int j;
public:
// run-time error: i is initialized before j
X(int val): j(val), i(j) { }
};

在这种情况下,构造函数初始化列表看起来似乎是用val 初始化 j,然后再
用 j 来初始化 i。然而,i 首先被初始化。这个初始化列表的效果是用尚未初
始化的 j 值来初始化 i!按照与成员声明一致的次序编写构造函数初始化列表
是个好主意.一般情况下,通过(重复)使用构造函数的形参而不是使用对象的数据成员,
可以避免由初始化式的执行次序而引起的任何问题

 

只要定义一个对象时没有提供初始化式,就使用默认构造函数,为所有形参提供默认实参的构造函数也定义了默认构造函数。
合.一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数。

NoDefault 没有默认构造函数,意味着:
1. 具有 NoDefault 成员的每个类的每个构造函数,必须通过传递一个初始
的 string 值给 NoDefault 构造函数来显式地初始化 NoDefault 成员。
2. 编译器将不会为具有 NoDefault 类型成员的类合成默认构造函数。如果
这样的类希望提供默认构造函数,就必须显式地定义,并且默认构造函数
必须显式地初始化其 NoDefault 成员。
3. NoDefault 类型不能用作动态分配数组的元素类型。
4. NoDefault 类型的静态分配数组必须为每个元素提供一个显式的初始化
式。
5. 如果有一个保存 NoDefault 对象的容器,例如 vector,就不能使用接受
容器大小而没有同时提供一个元素初始化式的构造函数。

实际上,如果定义了其他构造函数,则提供一个默认构
造函数几乎总是对的。

 

Time t(3,20,54),t1=t;//先调用定义的构造函数,然后t1=t or t1(t),调用系统的复制构造函数

Time t(3,20,54),t1;//调用定义的构造函数两次,将t1看作是使用定义的默认参数的构造函数

t1 = t;//是对象的赋值

C++编译器自动为类生成 1)默认构造函数;2)默认复制构造函数;3)默认赋值运算符重载函数*只有一个*。当一个类的数据成员中定义有指针,则一定要重新定义复制构造函数,否则一定会出错,因为存在两个对象同时指向了同一资源,其称为“浅复制”,如果类需要析构函数来析构资源时,则也需要显示定义一个复制构造函数来进行深复制。注意赋值与初始化是有区别的,初始化是在类创建的时候进行的,仅此一次。

 Time t;

t = Time(3,20,54);//创建无名对象,并通过赋值运算符重载把无名对象数据成员的值赋给对象t,然后系统自动调用析构函数,释放无名对象占用的资源后再删除无名对象。

1


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter