===============================================
未完待续,转载时请表明出处:
http://www.cofftech.com/thread-1396-1-1.html
欢迎大家跟帖讨论哈~~~~~
===============================================
初始化列表具有多个用途:
1.主要用于向直接基类和虚基类传递参数(以后讲继承的时候我们讨论)。
2.子对象的初始化。
3.特定类型数据成员(主要是数据的引用和常量数据)的初始化。
类的特定类型数据成员包括非静态常量数据以及非静态数据(包括非静态常量数据)的引用,这些数据不能直接在构造函数中初始化。
其中非静态常量数据成员在类中以const定义,在程序运行中不准改动。例如不允许在构造函数内进行以下操作:
class X
{
int n;
const int cn;
public:
X (int j1, int j2)
{ n = j1;
// cn = j2;
// Error: Cannot modify a const object
// in function X::X(int, int)
…… }
};
同样,类中的引用也不能在构造函数中直接初始化。例如不允许以下操作:
class X
{
int n;
int& rn; // 整型引用
public:
X(int j1, int j2){… //rn = j2;…} //构造函数
// Error: Reference member ‘ rn’ is
// not initialized in function X::X(int, int)
……
};
以上数据必须使用初始化列表,见下例:
[例1]常量和引用数据成员的初始化
#include <iostream.h>
class base
{
int n;
const int cn;
public:
int& rn;
base( int j1, int j2, int& j3) : cn(j1), rn(j3)
{ // 使用初始化列表,
// here you may not use "cn = j1;" or "rn = j3;"
n = j2;
cout<<"cn is "<<cn<<endl;
cout<<"n is "<<n<<endl;
cout<<"rn is "<<rn<<endl;
}
};
void main()
{
int j = 15;
base bb(10, 20, j);
//不能使用bb(10, 20, 15),因引用rn初始化时必须使用变量j
cout<<"bb.rn is "<< bb.rn <<endl;
}
/* Results:
cn is 10
n is 20
rn is 15
bb.rn is 15(bb.rn是j的别名) */
当程序中须要定义为常量的数据成员较多时,可不必在每个数据成员前加上const关键词,只须将成员函数定义为const即可,以使程序简明。而那些可以修改的数据则可定义为mutable(mutable和const的使用更多)。见下例:
[例2]将成员函数定义为const
#include <iostream.h>
class A
{
int cons_1;
int cons_2;
mutable int noncons;
public:
A (int a, int b, int c) {
cons_1 = a;
cons_2 = b;
noncons = c;
}
void modify_show( ) const;
};
void A::modify_show ( ) const
{
int temp = 15;
cout<<cons_1<<','<<cons_2<<','<<noncons<<endl;
// cons_1 = temp;
//error C2166: l-value specifies const object
// cons_2 = temp;
//error C2166: l-value specifies const object
noncons = temp;
cout<<cons_1<<','<<cons_2<<','<<noncons<<endl;
}
void main()
{
A obj(3, 6, 9);
obj.modify_show( );
}
/* Results:
3,6,9
3,6,15 */
以上常量程序中,只准许修改mutable数据成员。
分享到:
相关推荐
"黑马C++学习笔记" 本笔记主要记录了C++的基础知识和一些重要的概念,包括变量的声明、赋值、输出、引用、指针、结构体等。 变量声明和赋值 在C++中,变量的声明和赋值是非常重要的。变量可以是整数、浮点数、...
这篇学习笔记主要涉及了C++编程的一些核心概念,包括程序结构、变量、基本类型、初始化与赋值、可读性、常量与引用、typedef、枚举以及标准库中的字符串和向量类型。 1. **程序结构**: - 每个C++程序都必须包含`...
1. **基本数据类型**:C++中的基本数据类型包括整型(int、short、long、long long)、浮点型(float、double)、字符型(char)以及布尔型(bool)。理解每种类型的数据范围和用途是基础。 2. **变量声明与初始化*...
总结,C++学习笔记涵盖了从基础到高级的各种主题,包括面向对象编程的精髓、模板和标准库的使用、异常处理和命名空间的管理,以及C++11及后续标准的新特性。通过深入理解和实践这些知识点,开发者能够熟练掌握C++,...
4. **构造与析构函数**:构造函数在对象创建时自动调用,用于初始化成员变量;析构函数在对象生命周期结束时调用,用于清理资源。 5. **封装**:封装是面向对象的三大特性之一,通过访问修饰符(public、private、...
学习C语言时,首先要了解基本的数据类型(如int、char、float、double等),然后是变量的声明和初始化,以及运算符的用法。接着是流程控制语句,包括if-else条件判断、switch-case选择结构、for、while和do-while...
以上是C++ Primer第四版学习笔记中涉及的一些核心知识点。这些知识点涵盖了C++编程的基础语法、数据类型、容器、指针、内存管理以及控制结构等多个方面,对于初学者理解和掌握C++语言具有重要意义。希望这些内容能够...
【C和C++学习笔记】是一份集合了C语言与C++编程基础知识的学习资料,适合初学者进行系统学习。这份笔记可能包含了从基础语法到高级特性的详细讲解,旨在帮助初学者理解这两种语言的核心概念。 C语言是计算机科学中...
5. **构造函数与析构函数**:构造函数在对象创建时自动调用,用于初始化对象状态;析构函数在对象销毁前执行,用于清理资源。 6. **运算符重载**:C++允许为类的成员函数定义特定的运算符行为,如自增自减、加减...
【C++学习笔记】 C++是一种强大的面向对象编程语言,起源于C语言,引入了许多新的特性和概念。本文将从C++的基础知识出发,探讨bool类型、const限定符、内存对齐以及new和delete运算符等核心概念。 1. bool类型 ...
### C++学习笔记:易错点详解 #### 关键字`static`的作用 在C++中,`static`关键字有着非常重要的用途,特别是在处理变量和函数的生命周期、可见性以及存储方面。`static`可以用来定义静态变量和静态函数。 #####...
### C++学习笔记知识点梳理 #### 一、开始 C++是一种高级编程语言,它是在C语言的基础上发展起来的,并且增加了面向对象编程的支持。学习C++的第一步是从熟悉其基本语法开始,然后逐渐深入理解面向对象编程的概念...
- 构造与析构:对象的生命周期管理,构造函数初始化成员,析构函数清理资源。 - 静态成员与常量成员:静态成员属于类,而非单个对象;常量成员不能修改。 2. **面向对象编程** - 类与对象:封装数据和行为,对象...
### (转)一个优秀的C++学习笔记 #### 经验之谈 - **数组使用需谨慎**:在处理数组时,特别需要注意下标的操作。数组越界是编程中常见的错误之一,可能导致程序崩溃或者未定义行为。对于数组的访问应该始终保持在...
MyClass(int v) : value(v) {} // 使用构造函数的初始化列表来初始化成员变量 }; ``` #### 构造函数的调用顺序 - **继承结构**: 当一个派生类的构造函数被调用时,会首先调用基类的构造函数,以此确保基类资源...
C++中的成员函数和数据成员允许我们创建复杂的抽象数据类型。 五、构造与析构函数 构造函数是在创建对象时自动调用的特殊函数,用于初始化对象的状态。析构函数则在对象生命周期结束时自动调用,用于清理资源。这两...
《C++ Primer》是C++初学者的经典教材,其学习笔记涵盖了从基础知识到高级特性的全面解析。笔记中,作者采用了一种系统化的学习方法,包括整章阅读、标记重要点、手写草稿和录入电脑,以加深记忆并记录个人思考。 ...