构造函数初始化问题

§对const类型的数据成员进行初始化时不能直接赋值,如下面的赋值操作是错误的。

 1 class  C  {
 2     public:
 3         C() {
 4             x = 0;      //OK,x  not const
 5             c = 0;      //ERROR,c  is const
 6         }
 7
 8     private:
 9         int x;            //nonconst data member
10         const int c;    // const data  member
11 };

  因此,在C++中对const类型的数据成员进行初始化时必须为构造函数添加一个初始化列表,如下:

  

1 class  C{
2     public:
3         C () :c(0) {x = -1}
4
5     private:
6         int x;
7         const int c;      //const data  member
8 };

  再次总结:(规则)

  (1)构造函数的初始化段由一个冒号:开始,紧跟在冒号之后的是需要进行初始化的数据成员,然后是由一对小括号括起来的初始值。

  (2)初始化列表仅在构造函数中有效,不能用于其他函数。

  (3)构造函数的初始化列表可以初始化任何数据成员(const 和 非const),但const类型的数据成员只能在初始化列表里初始化,而不能用其他方法进行初始化。

1 class  C {
2     public:
3         C() : c(0), x(-1){}            //empty body
4
5     private:
6         int x;
7         const int c;                      //const data member
8 };
时间: 2024-12-13 15:45:30

构造函数初始化问题的相关文章

构造函数初始化器

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 {     class Program     {         static void Main(string[] args)         {             cat c = new cat(

C++构造函数初始化列表与赋值

C++中类的初始化操作一般有四个部分组成: 1.构造函数初始化列表 2.构造函数体内赋值 3.类外部初始化 4.类声明时直接赋值 对于内部数据类型(char,int,float...),构造函数初始化列表和构造函数体内赋值,基本上没多大区别,效率差异也不大,但两者不能共存: class Student { public: Student(char *name, int age): //A初始化列表 m_name(name), m_age(age) { } Student(char *name,

const成员或者引用成员必须使用构造函数初始化列表的方式

#include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2512: 'A' : no appropriate default constructor available;如果将const去掉就没错了! #include<iostream.h> class A { public: const int a; int b; A(int x):a(x){} };

构造函数初始化语句!!!

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace nange_1 { class A { readonly int Amyint_1 = 3; readonly int Amyint_2 = 4; public string name; public int age; private A() //私有构造函数执行其他构造 { //函数共用的初始化 Amyi

构造函数初始化列表

构造函数初始化列表有时是必要的.虽然构造函数分为初始化和计算阶段,使用初始化构造函数列表效率要高一些,这是其一,而且有些情况下必须使用,下面是一例, 1 class Foo 2 { 3 public: 4 Foo(int x, int y): a(x), b(y) {} 5 6 private: 7 int a; 8 int b; 9 }; 10 11 class Bar 12 { 13 public: 14 Bar(): foo(10, 10) {} 15 private: 16 Foo fo

[c++基本语法]——构造函数初始化列表

c++构造函数初始化成员变量列表: 1 #pragma once 2 class Node 3 { 4 public: 5 int data; // 权值 6 Node *parent; // 父节点 7 Node *left; // 左子节点 8 Node *right; // 右子节点 9 public: 10 // 该段代码是c++的基本语法中的“构造函数初始化成员变量列表” 11 Node(void):data(-1),parent(NULL),left(NULL),right(NULL

使用构造函数初始化三角形类

方法1:使用带参数构造函数,即Triangle(double x, double y, double z),三边长在调用时由实参直接给出 #include <iostream> #include <cmath> using namespace std; class Triangle { public: //带参构造函数 Triangle(double x, double y, double z); double perimeter(void);//计算三角形的周长 double a

使用构造函数初始化成员数组

#include <iostream> using namespace std; class Box//盒子类 { public: //定义一个构造函数用于初始化对象数组 Box(int h, int w, int l); int volume();//计算盒子的体积 private: int height;//盒子的高 int width;//盒子的宽 int length;//盒子的长 }; //定义一个构造函数用于初始化对象数组 Box::Box(int h, int w, int l)

构造函数初始化

参考:c++ primer p385 构造函数的名字与类的名字相同,且不能返回指定类型 构造函数可以被重载,只要构造函数的形参表是唯一的 构造函数初始化有两种方式,一种是使用初始化列表,一种是在构造函数的函数体内对数据成员赋值 初始化列表: 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式: Sales_item::Sales_item(const string &book): isbn(book), units_sold(0), re

转:C++类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample { public:     int a;     float b;     //构造函数初始化列表     CExample(): a(0),b(8.8)     {}     //构造函数内部赋值     CExample()     {         a=0;         b=8.8;     } }; 上面的例子中两个构造函数的结果是一样