标题:求助:对构造函数和对象成员的迷茫,大家帮忙看下是如何调用的
只看楼主
qshzh102
Rank: 2
等 级:论坛游民
帖 子:19
专家分:20
注 册:2010-9-14
结帖率:50%
已结贴  问题点数:0 回复次数:3 
求助:对构造函数和对象成员的迷茫,大家帮忙看下是如何调用的
#include <iostream.h>
class object {
private:
     int val;
public:
    object();
    object(int i);
    ~object();
};
object::object()
{
    val=0;
    cout << "Default constructor for object" << endl;
}
object::object(int i)
{
    val = i;
    cout << "Constructor for object " << val <<endl;
}
object::~object()
{
    cout << "Destructor for object "<< val << endl;
}
class container {
privat:
    object one;                                                
    object two;                                                //object的两个对象one和two定义到container中和定义在类外是不是一样的含义?
    int data;
public:
     container();
    container(int i, int j , int k);
    ~container();
};
container:: container()
{
    data = 0;
    cout << "Default constructor for oontainer " endl ;
}
containe::container(int i, int j , int k):two(i),one(j)         //该构造函数该如何理解?
{
     data = k;
    cout << "Constructor for container " << endl;
}
container::~container()
{
    cout << "Destructor for container " << endl;
}
main()
{
     container anObj( 5 , 6 ,10);
}


下面的这个构造函数一直不是很明白是如何进行调用的:
containe::container(int i, int j , int k):two(i),one(j)      
{
     data = k;
    cout << "Constructor for container " << endl;
}
 麻烦大家给解释下了 非常感谢
有构造函数对象成员资料的也可以发下 先谢谢了
搜索更多相关主题的帖子: 函数 构造 成员 对象 
2010-11-04 17:00
ljt
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:191
专家分:431
注 册:2009-4-6
得分:3 
one和tow就是container的成员变量啊,只不过是用户定义类型而已。
containe::container(int i, int j , int k):two(i),one(j)      
{
     data = k;
    cout << "Constructor for container " << endl;
}
two(i),one(j)是参数列表(初始化了成员变量)你也可以放到大括号里面去呀。
给你看这个,这里讲的很清楚:

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

class CExample {

    public:

      int a;

      float b;

    //构造函数初始化列表

    CExample(): a(0),b(8.8)

    {}

    //构造函数内部赋值

    CExample()

    {

        a=0;

        b=8.8;

    }

};

上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。

初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数:

1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

例如:

class  A {

//......int  mem;   

public:

      A (int  a) {  mem=a;  }     //类A 有且仅有一个构造函数

};

 

class   B {

      A  a;

public:

     B( ) : a(3)  { }    // 正确。但不能这样定义:  B( ) {  //......  }

     B(int  a1) :a(a1)  {   }

};

2010-11-05 15:29
shadow_rong
Rank: 2
等 级:论坛游民
帖 子:7
专家分:34
注 册:2010-11-1
得分:3 
一句话,构造函数的调用顺序与参数列表无任何关系.....他和你声明对象的顺序有关,

如果是 继承的类遵循原则: 先基类构造,再成员构造,再本类构造.

如果是一个类,构造的时候先检查,是否有 类成员对象的定义,如果有,先构造成员对象,然后再构造自己.. 当然如果成员对象有多个,按照顺序来构造.....

我自己打字的。。.
2010-11-05 21:44
zhj123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:21
注 册:2010-8-31
得分:3 
我也是新手,来学习学习
2010-11-05 23:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-324983-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.379030 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved