类的其他成员
2015-08-16 16:49
190 查看
在类定义中,除了可以指定成员的访问权限外,还可以定义各种特殊用途的成员。
一、常成员
在类中,定义常成员用const约束。常数据成员是指数据成员在实例化被初始化后约束为只读;常成员函数是指成员函数的this指针被约束为指向常量的常指针,在函数体内不能修改数据成员的值。
1、常数据成员
在C++的类定义中,const可以约束基本类型的数据成员为常数据成员。因为类对象要通过执行构造函数才能建立存储空间,所以,用构造函数实现常数据成员值的初始化是必须的。在C++语言中,使用构造函数参数初始式对常数据成员进行初始化。
(1)常数据成员可以在构造函数中直接用常量进行初始化,这样,每个对象建立的常数据成员都有相同的值。
若在定义对象的说明语句以const作前缀,则该对象称为常对象。这个对象的全部数据成员在作用域中约束为只读。
常成员函数的this指针被约束为指向常量的常指针。由于this指针隐含定义,所以常成员函数在函数头以关键字const作后缀。例如:
const X* const this ;
一、常成员
在类中,定义常成员用const约束。常数据成员是指数据成员在实例化被初始化后约束为只读;常成员函数是指成员函数的this指针被约束为指向常量的常指针,在函数体内不能修改数据成员的值。
1、常数据成员
在C++的类定义中,const可以约束基本类型的数据成员为常数据成员。因为类对象要通过执行构造函数才能建立存储空间,所以,用构造函数实现常数据成员值的初始化是必须的。在C++语言中,使用构造函数参数初始式对常数据成员进行初始化。
(1)常数据成员可以在构造函数中直接用常量进行初始化,这样,每个对象建立的常数据成员都有相同的值。
//由构造函数直接用常量初始化常数据成员 #include<iostream> using namespace std; class Mclass { public: int k; const int M;//说明常数据成员 Mclass():M(5)//用初始式对常数据成员赋值 {} void testFun() { //M++;错误,不能在成员函数中修改常数据成员 k++; } }; int main() { Mclass t1, t2; t1.k = 123; //t1.M = 123;错误,不能在类外修改常数据成员 cout << "t1.k=" << t1.k << " " << "t1.M=" << t1.M << endl; t2.k = 200; t2.testFun(); cout << "&t1.M=" << &t1.M << endl; cout << "t2.k=" << t2.k << " " << "t2.M=" << t2.M << endl; cout << "&t2.M=" << &t2.M << endl; }(2)另一种对常数据成员进行初始化的方法是,使用带参数的构造函数,创建对象时,用实际参数对常数据成员赋值。这样,每一个对象的常数据成员就可以有不同的初始值。
//用带参数的构造函数初始化常数据成员 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> using namespace std; struct Date { int year, month, day; }; class Student { public: Student(int y,int m,int d,int num = 0,char *pname = "noname"); void PrintStudent()const;//常成员函数 private: const int code;//常数据成员 char name[20]; Date birthday;//结构数据成员 }; void Student::PrintStudent()const { cout << "序号:" << code << "\t姓名:" << name << "\t出生日期:" << birthday.year << "-" << birthday.month << "-" << birthday.day << endl; } //带参数的构造函数完成数据成员的初始化 Student::Student(int y, int m, int d, int num, char *pname) :code(num) { strcpy(name, pname); name[sizeof(name) - 1] = '\0'; birthday.year = y; birthday.month = m; birthday.day = d; } int main() { Student stu1(1990, 3, 21, 1001, "陈春"); stu1.PrintStudent(); Student stu2(1984, 10, 1, 1002, "张庆华"); stu2.PrintStudent(); }2、常对象
若在定义对象的说明语句以const作前缀,则该对象称为常对象。这个对象的全部数据成员在作用域中约束为只读。
//常对象测试 #include<iostream> using namespace std; class T_class { public: int a, b; T_class(int i, int j) { a = i; b = j; } }; int main() { const T_class t1(1, 2); T_class t2(3, 4); //t1.a=7; //t1=b=9;//错误,不能修改常对象的数据成员 t2.a = 9; t2.b = 7; cout << "t1.a=" << t1.a << " " << "t1.b=" << t1.b << endl; cout << "t2.a=" << t2.a << " " << "t2.b=" << t2.b << endl; }3、常成员函数
常成员函数的this指针被约束为指向常量的常指针。由于this指针隐含定义,所以常成员函数在函数头以关键字const作后缀。例如:
class X { int a; int f() { return a++; } int g()const//错误,常成员函数不能修改数据成员 { return a++; } };在类X中,成员函数g首部以关键字const作后缀,称为常成员函数。相当于常成员函数的this指针类型为:
const X* const this ;
相关文章推荐
- 安装archlinux+cinnamon笔记
- 工厂方法
- python对拍程序
- 是德科技完成对Anite的收购
- Java parseInt_使用此方法得到的原始数据类型的一个特定的字符串
- Leetcode -- Remove Duplicates from Sorted List II
- (tomcat访问不了的两种解决方法)Bad Request(Invalid Hostname)
- Memcached 及 Redis 架构分析和比较
- EMC测试
- 颜色缩减(带Trackbar)【从毛星云Opencv3编程入门P75 P111例程改编】
- MySQL覆盖索引
- Caffe源码(七):ReLU,Sigmoid and Tanh
- 华为OJ(统计大写字母个数)
- Android 控件沿贝塞尔曲线运动(上)
- 删除一个集合中的元素
- Qt-Style-Sheets-语法
- Android知识点清单(不断更新)
- 线性筛素数
- LeetCode解题报告--3Sum Closest
- Linux学习笔记-----RPM包管理----源码包安装