当前位置:
文档之家› C++第14章 常量成员静态成员与友元
C++第14章 常量成员静态成员与友元
重 载 函 数
14.2 常量成员函数
class Circle{ public: Circle(double r); // 构造函数 double area() const ; // 常量成员函数 double perimeter() const ; // 常量成员函数 double getRadius() const ; // 常量成员函数 private: double radius; const double PI; // 常量数据成员 }; Circle::Circle(double r): radius(r), PI(3.1415) { } double Circle::area() const { return PI*radius*radius; 建议:将不修改类数据成员值的 } double Circle::perimeter() const { 成员函数定义为常量成员函数。 return 2*PI*radius; } double Circle::getRadius() const { return radius; 注意:在类外实现常量成员函数时也要带const }
常量是一个在程序执行过程中其值不能改变的量。C++通过关 键字 const 来定义一个常量。常量在定义时必须进行初始化! 例: const double PI = 3.1415; const double DC; PI = 3.1415926; // 常量定义并初始化 // 错误!必须进行初始化! // 错误!不允许修改!
14.4 静态数据成员
类是类型而不是具体的数据对象,类的对象都是该类的实 例,每个类对象都具有自己的数据成员,而且是相互独立,各 自占内存空间。 然而,程序中往往需要让类的所有对象在类的范围内共享 某个数据。 Student private: int count; // 班级人数
通过静态数据成员来实现
{ //… }
类外: 类型标识符 类名::成员函数名(参数列表) const // 实现
{ //… }
14.2 常量成员函数 说明:
• const 是函数类型的一个组成部分,因此在实现部分也要带 const 关键字。 • 常量成员函数不更新对象的数据成员,也不能调用该类中没 有用 const 修饰的成员函数。 • const 关键字可以参与区分重载函数。
14.2 常量成员函数
class Circle{ public: Circle(double r): radius(r), PI(3.1415) // 初始化表 {} double area() const { // 常量成员函数 return PI*radius*radius; } double perimeter() const { // 常量成员函数 return 2*PI*radius; } double getRadius() { // 普通成员函数 return radius; } double getRadius() const { // 重载常量成员函数 return radius; } private: double radius; const double PI; // 常量数据成员 };
注意:常对象只能调用它的常量成员函数,而不能调 用其他成员函数。
14.3 常对象
#include <iostream> using namespace std; class Rectangle{ public: Rectangle(): width(0.0), height(0.0) { } // 默认构造函数 Rectangle(double w, double h): width(w), height(h) { } // 带参数的构造函数 double area() const { // 常量成员函数 return width*height; } double perimeter() const { // 常量成员函数 return 2*(width+height); } void print(){ // 普通成员函数 cout<<“Width: ”<<width<<“, Height: ”<<height<<endl; } void print() const { // 重载常量成员函数 cout<<“Width: ”<<width<<“, Height: ”<<height<<endl; } private: double width; double height; };
14.4 静态数据成员 静态数据成员:
• 静态数据成员通过 static 关键字进行定义。 • 所有对象的静态数据成员占用同一个内存空间(只有一份)。 • 静态数据成员可以实现数据共享。 • 静态数据成员属于一个类而不属于该类的任何对ቤተ መጻሕፍቲ ባይዱ。 • 静态数据成员可以独立于对象存在和被引用。
14.4 静态数据成员 静态数据成员定义:
14.1 常量数据成员
#include <iostream> #include <cstring> using namespace std; class Student{ public: Student(char *_name, int _id, bool _sex): id(_id), sex(_sex){ name = new char[strlen(_name)+1]; strcpy(name, _name); 常量数据成员: } const 类型 标识符; ~Student() { if(name!=NULL) 类型 const 标识符; delete [ ] name; } int main(){ const char * getName() { return name; } Student p(“John”, 11151, true); int getID() { return id; } cout<<“姓名: ”<<p.getName()<<endl; bool getSex() { return sex; } cout<<“学号: ”<<p.getID()<<endl; protected: cout<<“性别: ”<<p.getSex()<<endl; char *name; // 姓名 return 0; int const id; // 学号 } bool const sex; // 性别 };
static 类型标识符 静态数据成员名; // 类内
静态数据成员初始化:
类型标识符 类名::静态数据成员名 = 初始值; // 类外
说明:
• 静态数据成员的初始化放在类体外进行(必须初始化)。 • 初始化时前面不允许再加 static 关键字。 • 初始化时使用作用域运算符来标明它所属的类。 • 访问静态数据成员: 类名::静态数据成员名
14.3 常对象 常对象(const 对象):
常对象的所有数据成员在程序执行过程中都不能被修改。
定义形式:
const 类名 对象名; 或 const 类名 对象名(参数列表);
类名 const 对象名; 或 类名 const 对象名(参数列表);
例: const Circle cp(13.14); Circle const cp(13.14); // 常对象定义 // 常对象定义
14.2 常量成员函数 常量成员函数(const 成员函数):
• 常量成员函数只能引用类中的数据成员而不能修改它们的值。
• 只有常量成员函数才有资格操作常对象。
定义形式: 类内: 类型标识符 成员函数名(参数列表) const; 类型标识符 成员函数名(参数列表) const // 声明 // 定义
14.3 常对象
int main() { Rectangle rect1(2.0, 3.0); // 普通对象 cout<<“Area: ”<<rect1.area()<<endl; // 调用常量成员函数 rect1.print(); // 调用普通成员函数
const Rectangle rect2(4.0, 5.0); // 常对象 cout<<“Area: ”<<rect2.area()<<endl; // 调用常量成员函数 rect2.print(); // 调用常量成员函数
return 0; }
常对象只能调用常量成员函数,而普通对象既可以调用 普通成员函数,也可以调用常量成员函数。但当发生 const重载时,普通对象调用是非const成员函数,而常 对象调用的是带const的成员函数。
Ch14_01
14.3 常对象
#include <iostream> using namespace std; class Complex{ public: Complex(double r = 0.0, double img = 0.0): real(r), image(img) { } void set(double r, double img) { real = r; image = img; } double getReal() const { return real; } double getImage() const { return image; } void print() const { cout<<real<<“+”<<image<<“i”<<endl; } private: double real; double image; }; void add(const Complex &cp1, const Complex &cp2){ Complex result; result.set(cp1.getReal()+cp2.getReal(), cp1.getImage()+cp2.getImage()); result.print(); } int main(){ const引用对象和const指针对 Complex cp1(1.0, 2.0), cp2(3.0, 4.0); 象只能访问类的常量成员函数。 add(cp1, cp2); return 0; }