C++ 构造函数后加冒号作用

百度知道 > 电脑/网络 > 编程语言 > C/C++

请问C++中一个构造函数后面加个冒号是什么意思

2008-11-06 12:56 流星AAA | 分类:C/C++ | 浏览5354次

比如这个例子:#includeclass A { public: int x; A(int a=0){x=a}; } };class B1:publicA{ public; int y1; B1(int a=0,int b=0):A(b) //就是这句 { y1=a; } };请问那句后面的 :A(b) 代表什么啊,为什么要跟个B1基类的构造函数?? 谢谢了

A(b)实际上是做的是用b初始化A的成员x;既x=b;:是初始化列表方式,建议你看看相关章节再来理解.B1(int a=0,int b=0):A(b) //就是这句 { y1=a; } 其实可以写成:B1(int a=0,int b=0):A(b),y1(a){}这就是初始化列表方式,你要是这都没弄懂,就到继承了,那肯定更不好理解!

C++ 构造函数后加冒号

其实冒号后的内容是初始化成员列表,一般有三种情况:

1、对含有对象成员的对象进行初始化,例如,

类line有两个私有对象成员startpoint、endpoint,line的构造函数写成:

line(int sx,int sy,int ex,int ey):startpoint(sx,sy),endpoint(ex,ey){……}

初始化时按照类定义中对象成员的顺序分别调用各自对象的构造函数,再执行自己的构造函数

2、对于不含对象成员的对象,初始化时也可以套用上面的格式,例如,

类rectangle有两个数据成员length、width,其构造函数写成:

rectangle():length(1),width(2){}

rectangle(int x,int y):length(x),width(y){}

3、对父类进行初始化,例如,

CDlgCalcDlg的父类是MFC类CDialog,其构造函数写为:

CDlgCalcDlg(CWnd* pParent ): CDialog(CDlgCalcDlg::IDD, pParent)

其中IDD是一个枚举元素,标志对话框模板的ID

使用初始化成员列表对对象进行初始化,有时是必须的,有时是出于提高效率的考虑

谈C++中初始化列表

今早碰到一个问题,后来发现是初始化列表的问题,基础还不够好,查了一下资料,现把个人所得分享给大家,希望有所帮助.

在C++中,构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表

位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体

内的任何代码被执行之前。

构造函数初始化表的使用规则:

1.如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。

例如

class A

{…

A(int x); // A 的构造函数

};

class B : public A

{…

B(int x, int y);// B 的构造函数

};

B::B(int x, int y): A(x) // 在初始化表里调用A 的构造函数

{

}

2.类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式

来初始化

class Shape

{

const int m_size; //

const 常量

float m_width;

float m_height;

public:

Shape(int s,float w,float h):m_size(s) //只能在这初始化

{

//m_size =s; //在初始化将出错

m_width = w;

m_height = h;

}

};

3. 类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的

效率不完全相同。

方式一:在初始化列表中初始化

class Line

{

.........

};

class Shape

{

float m_width;

float m_height;

Line m_line;

public:

Shape(float w,float h,Line line):m_line(line)

{

m_width = w;

m_height = h;

}

};

方式二:在构造函数内部初始化

class Line

{

.........

};

class Shape

{

float m_width;

float m_height;

Line m_line;

public:

Shape(float w,float h,Line line)

{

m_line = line;

m_width = w;

m_height = h;

}

};

二者区别在与:前者效率高于后者,因为前者只调用拷贝构造函数,而后者

调用了构造和拷贝构造函数.

简单总结三条:(使用初始化列表)

a.类存在继承关系;

b.类的const常量;

c.类的数据成员的初始化(非内部数据类型的成员对象).

就这些了,希望大家进步.

百度知道 > 电脑/网络 > 编程语言 > C/C++

请问C++中一个构造函数后面加个冒号是什么意思

2008-11-06 12:56 流星AAA | 分类:C/C++ | 浏览5354次

比如这个例子:#includeclass A { public: int x; A(int a=0){x=a}; } };class B1:publicA{ public; int y1; B1(int a=0,int b=0):A(b) //就是这句 { y1=a; } };请问那句后面的 :A(b) 代表什么啊,为什么要跟个B1基类的构造函数?? 谢谢了

A(b)实际上是做的是用b初始化A的成员x;既x=b;:是初始化列表方式,建议你看看相关章节再来理解.B1(int a=0,int b=0):A(b) //就是这句 { y1=a; } 其实可以写成:B1(int a=0,int b=0):A(b),y1(a){}这就是初始化列表方式,你要是这都没弄懂,就到继承了,那肯定更不好理解!

C++ 构造函数后加冒号

其实冒号后的内容是初始化成员列表,一般有三种情况:

1、对含有对象成员的对象进行初始化,例如,

类line有两个私有对象成员startpoint、endpoint,line的构造函数写成:

line(int sx,int sy,int ex,int ey):startpoint(sx,sy),endpoint(ex,ey){……}

初始化时按照类定义中对象成员的顺序分别调用各自对象的构造函数,再执行自己的构造函数

2、对于不含对象成员的对象,初始化时也可以套用上面的格式,例如,

类rectangle有两个数据成员length、width,其构造函数写成:

rectangle():length(1),width(2){}

rectangle(int x,int y):length(x),width(y){}

3、对父类进行初始化,例如,

CDlgCalcDlg的父类是MFC类CDialog,其构造函数写为:

CDlgCalcDlg(CWnd* pParent ): CDialog(CDlgCalcDlg::IDD, pParent)

其中IDD是一个枚举元素,标志对话框模板的ID

使用初始化成员列表对对象进行初始化,有时是必须的,有时是出于提高效率的考虑

谈C++中初始化列表

今早碰到一个问题,后来发现是初始化列表的问题,基础还不够好,查了一下资料,现把个人所得分享给大家,希望有所帮助.

在C++中,构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表

位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体

内的任何代码被执行之前。

构造函数初始化表的使用规则:

1.如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。

例如

class A

{…

A(int x); // A 的构造函数

};

class B : public A

{…

B(int x, int y);// B 的构造函数

};

B::B(int x, int y): A(x) // 在初始化表里调用A 的构造函数

{

}

2.类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式

来初始化

class Shape

{

const int m_size; //

const 常量

float m_width;

float m_height;

public:

Shape(int s,float w,float h):m_size(s) //只能在这初始化

{

//m_size =s; //在初始化将出错

m_width = w;

m_height = h;

}

};

3. 类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的

效率不完全相同。

方式一:在初始化列表中初始化

class Line

{

.........

};

class Shape

{

float m_width;

float m_height;

Line m_line;

public:

Shape(float w,float h,Line line):m_line(line)

{

m_width = w;

m_height = h;

}

};

方式二:在构造函数内部初始化

class Line

{

.........

};

class Shape

{

float m_width;

float m_height;

Line m_line;

public:

Shape(float w,float h,Line line)

{

m_line = line;

m_width = w;

m_height = h;

}

};

二者区别在与:前者效率高于后者,因为前者只调用拷贝构造函数,而后者

调用了构造和拷贝构造函数.

简单总结三条:(使用初始化列表)

a.类存在继承关系;

b.类的const常量;

c.类的数据成员的初始化(非内部数据类型的成员对象).

就这些了,希望大家进步.


相关文章

  • 冒号在C++的用法
  • ::C++中的作用 1. 作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 如:A,B表示两个类,在A,B中都有成员member.那么 A::member就表示类A ...查看


  • 考试中经典的c++选择题库
  • C++选择题集 1. 下列的各类函数中,不是类的成员函数.( C ) A) 构造函数 B)析构函数 C)友元函数 D)拷贝初始化构造函数 2. 作用域运算符"::"的功能是:( B ) A) 标识作用域的级别的 B)指出 ...查看


  • 2011上海专升本C++考试大纲
  • <C++程序设计>考试大纲 一.基本要求 1. 掌握C++语言的基本语法规则. 2.掌握程序设计的三种基本结构. 3.掌握函数.指针和结构体的基本知识及相关应用. 4.熟练掌握有关类与对象的相关知识. 5.能够采用面向过程和面向 ...查看


  • 亚信面试题
  • C 部分 1. 排序算法 时间复杂度 ,说出你喜欢的一种算法,说其原因 插入排序 O(n^2) 归并排序 O(nlog2n) 快速排序 最好 O(nlog2n) 最坏 O(n^2) 冒泡排序 O (n^2) 选择排序 O(n^2) 堆排序 ...查看


  • c++题库 以及答案
  • 一.单选题 1. C++源程序文件的缺省扩展名为( ). A. cpp B. exe C. obj D. lik 2. 由C++源程序文件编译而成的目标文件的缺省扩展名为( ). A. cpp B. exe C. obj D. lik 3. ...查看


  • 逆向 C -- 识别类及其构造函数 - FISH 的专栏 - CSDNBlog
  • 逆向 C++ 这些年来,逆向工程分析人员一直是凭借着汇编和 C 的知识对大多数软件进行逆向工程的,但是,现在随着越来越多的应用程序和恶意软件转而使用 C++语言进行开发,深入理解 C++ 面向对象方式开发的软件的反汇编技术就显得越发的必要. ...查看


  • C++程序设计实验5-8
  • 实验五 构造函数与析构函数的编程 一.实验目的 1.进一步加深对类和对象的理解. 2.掌握类的构造函数和析构函数的概念.意义和使用方法. 3.掌握重载构造函数的含义和使用. 4.编写一个较为复杂的类和对象的应用程序. 二.实验内容 1.设计 ...查看


  • C++题目作业14
  • HZAU-专业C++作业14(继承与多态性) 判断题 1. 派生类的构造函数的初始化列表中如果不写对基类构造函数的调用,则自动调用基类的拷贝构造函数.f 2. 在多继承情况下,派生类的构造函数中基类构造函数的执行顺序取决于定义派生类时所指定 ...查看


  • 软件公司入职面试笔试题(C++)
  • C++/C试题 本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用语法,不涉及数据结构.算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力. 笔试时间90分钟 ...查看


热门内容