31类和对象 常成员函数 [例 Ex ConstFunc]常成员函数的使用。 #include < iostream. h class cone t public COne (int a, int b)x=a;y=b;) void printo void printo const //声明常成员函数 private Int X, y, void COne:: printo t cout<<<<"," <<y<endl void COne:: printo const cout<<"使用常成员函数:"<<x<<","<<y<<endl void main o COne one(5, 4) one print o const COne two(20, 52) two printo
3.1类和对象 ➢ 常成员函数 [例Ex_ConstFunc] 常成员函数的使用。 #include <iostream.h> class COne { public: COne(int a, int b) { x = a; y = b; } void print(); void print() const; // 声明常成员函数 private: int x, y; }; void COne::print() { cout<<x<<", "<<y<<endl; } void COne::print() const { cout<<"使用常成员函数:"<<x<<", "<<y<<endl; } void main() { COne one(5, 4); one.print(); const COne two(20, 52); two.print(); }
31类和对象 常成员函数可以理解成是“只读”函数,既不能更改数据成员的值,也不能 调用那些引起数据成员值变化的成员函数,只能调用 cons t成员函数。例如 class cdate public CDate( int mn, int dy, int yr);//构造函数 int getMonthOconst /常成员函数 void setMonth( int mn //一般成员函数 int month //数据成员 int CDate:: getMonth o const return month;//不能修改数据成员的值,只有一个返回值 void CDate:: setMonth( int mn month=mn;//可以使用赋值等语句,修改数据成员的值
3.1类和对象 常成员函数可以理解成是“只读”函数,既不能更改数据成员的值,也不能 调用那些引起数据成员值变化的成员函数,只能调用const成员函数。例如: class CDate { public: CDate( int mn, int dy, int yr );// 构造函数 int getMonth() const; // 常成员函数 void setMonth( int mn ); // 一般成员函数 int month; // 数据成员 }; int CDate::getMonth() const { return month; // 不能修改数据成员的值,只有一个返回值 } void CDate::setMonth( int mn ) { month = mn; // 可以使用赋值等语句,修改数据成员的值 }
31类和对象 常数据成员 类型修饰符 cons t不仅可以说明成员函数,也可以说明数据成员。类中声明 const数据 成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。例如: [例 Ex ConstAta]常数据成员的使用。 #include <iostream. h> class cone public COne(int a):x(a),r(x) /常数据成员的初始化 void print o const int &r //引用类型的常数据成员 private const int x /常数据成员 static const int y /静态常数据成员 const int COne:: y=10; //静态数据成员的初始化 void COne:: print o cout<"x="<<x<",y="<<y<<",r="<<r<<endl void maino COne one(100) one printo 该程序的运行结果为:x=100,y=10,r=100
3.1类和对象 ➢ 常数据成员 类型修饰符const不仅可以说明成员函数,也可以说明数据成员。类中声明const数据 成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。例如: [例Ex_ConstData] 常数据成员的使用。 #include <iostream.h> class COne { public: COne(int a):x(a),r(x) // 常数据成员的初始化 { } void print(); const int &r; // 引用类型的常数据成员 private: const int x; // 常数据成员 static const int y; // 静态常数据成员 }; const int COne::y = 10; // 静态数据成员的初始化 void COne::print() { cout<<"x = "<<x<<", y = "<<y<<", r = "<<r<<endl; } void main() { COne one(100); one.print(); } 该程序的运行结果为: x = 100, y = 10, r = 100
31类和对象 318this指针 对一个对象调用成员函数时,编译器将对象的地址赋给this指针,再调用成员函数, 每次成员函数存取数据成员时,由隐含作用this指针。可以用*this来标识调用该成 员函数的对象 [例 Ex This]this指针的使用 #inc lude < iostream. h> class cone public COne(x=y=0 COne(int a, int b)(x=a;y=b void copy( cone &a) //对象引用作函数参数 void printo icout<<x< ,"<<y<endl; private Int x, y void COne: copy( COne &a) f (this = &a) return *this void main o COne one, two(3, 4) one print(; one copy (two) one.printo
3.1类和对象 3.1.8 this指针 对一个对象调用成员函数时,编译器将对象的地址赋给this指针,再调用成员函数, 每次成员函数存取数据成员时,由隐含作用this指针。可以用*this来标识调用该成 员函数的对象。 [例Ex_This] this指针的使用。 #include <iostream.h> class COne { public: COne() { x = y = 0; } COne(int a, int b) { x = a; y = b; } void copy(COne &a); //对象引用作函数参数 void print() {cout<<x<<" , "<<y<<endl; } private: int x, y; }; void COne::copy(COne &a) { if (this == &a) return; *this = a; } void main() { COne one, two(3, 4); one.print();one.copy(two); one.print(); }
31类和对象 319类的作用域和对象的生存期 类的作用域 类的作用域是指在类的定义中由一对花括号所括起来的部分 类作用域中可以定义变量,也可以定义函数。类作用域中定义的变量不能使 用auto, register和 extern等修饰符,只能用 static修饰符,而定义的函数 也不能用 extern修饰符。在类作用域中的静态成员和成员函数还具有外部的 连接属性 文件作用域中可以包含类作用域,类作用域小于文件作用域。一般地,类作 用域中可包含成员函数的作用域。 具体地讲,某个类A中某个成员M在下列情况下具有类A的作用域: (1)成员M出现在类A的某个成员函数中,并且该成员函数没有定义同名标识 (2)成员M出现在a.M或A::M表达式中,其中a是A的对象。 (3)成员M出现在pa-》M这样的表达式中,其中pa是一个指向A类对象的指针
3.1类和对象 3.1.9 类的作用域和对象的生存期 1. 类的作用域 ▪ 类的作用域是指在类的定义中由一对花括号所括起来的部分。 ▪ 类作用域中可以定义变量,也可以定义函数。类作用域中定义的变量不能使 用auto,register和extern等修饰符,只能用static修饰符,而定义的函数 也不能用extern修饰符。在类作用域中的静态成员和成员函数还具有外部的 连接属性。 ▪ 文件作用域中可以包含类作用域,类作用域小于文件作用域。一般地,类作 用域中可包含成员函数的作用域。 ▪ 具体地讲,某个类A中某个成员M在下列情况下具有类A的作用域: (1) 成员M出现在类A的某个成员函数中,并且该成员函数没有定义同名标识 符。 (2) 成员M出现在a.M或A::M表达式中,其中a是A的对象。 (3) 成员M出现在pa->M这样的表达式中,其中pa是一个指向A类对象的指针