华东师范大学数学科学学院 目录页 School of Mathematical Sciences,ECNU Contents 常对象与常成员 2 对象数组与对象指针 3 向量类:vector 字符串类:string http://math.ecnu.edu.cn/~jypan
目录页 Contents 华东师范大学 数学科学学院 School of Mathematical Sciences, ECNU http://math.ecnu.edu.cn/~jypan 1 2 常对象与常成员 对象数组与对象指针 3 向量类:vector 4 字符串类:string
1 常对象与常成员 为什么需要常对象 ■ 常对象的声明 常数据成员、常函数成员 ■ 常引用 关键字const http://math.ecnu.edu.cn/~jypan 3
http://math.ecnu.edu.cn/~jypan 3 常对象与常成员 为什么需要常对象 常对象的声明 常数据成员、常函数成员 常引用 关键字 const 1
为什么常对象 为什么常对象: 将对象声明成常对象,可以有效地保护数据。 常对象的声明 const类名 对象名; //OK 类名const对象名; /OK ·常对象必须进行初始化 常对象:数据成员均为常量 不能通过常对象调用普通成员函数! 常对象只能作为常成员函数的目的对象! http://math.ecnu.edu.cn/-jypan
http://math.ecnu.edu.cn/~jypan 4 为什么常对象 常对象必须进行初始化 常对象:数据成员均为常量 为什么常对象: 将对象声明成常对象,可以有效地保护数据。 常对象的声明 const 类名 对象名; // OK 类名 const 对象名; // OK † 不能通过常对象调用普通成员函数! † 常对象只能作为常成员函数的目的对象!
常成员 口常成员函数 类型说明符 函数名(形参)const; ●常对象只能调用常成员函数 ·常成员函数可以被普通对象调用 ·无论对象是否为常对象,常成员函数的目的对象都将被视为常对象 口常数据成员 ●将数据成员声明为常量 ●必须初始化(采用参数初始化表,不能在构造函数内赋值) Example /假定数据成员a和b是常量,c是普通变量 Myclass:Myclass(int x,int y,int z):a(x),b(y) {c=z;} http://math.ecnu.edu.cn/~jypan 5
http://math.ecnu.edu.cn/~jypan 5 常成员 常对象只能调用常成员函数 常成员函数可以被普通对象调用 无论对象是否为常对象,常成员函数的目的对象都将被视为常对象 常成员函数 常数据成员 将数据成员声明为常量 必须初始化(采用参数初始化表,不能在构造函数内赋值) // 假定数据成员 a 和 b 是常量,c 是普通变量 Myclass::Myclass(int x, int y, int z): a(x), b(y) { c=z; } 类型说明符 函数名(形参) const; Example
常成员 class Myclass { void display()const; void show(); const int a; int b; } Myclass:Myclass(int x,int y):a(x){b y; 。。。。 int main ( Myclass obj1(2,3); const Myclass obj2(4,5); Myclass const obj3(6,7); obj1.display();//OK obj2.display();//OK obj3.display();//OK obj1.show();//OK obj2.show();/ERROR obj3.show();/ERROR } ex11 class_const.cpp http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 6 常成员 class Myclass { ... ... void display() const; void show(); ... ... const int a; int b; }; Myclass::Myclass(int x, int y): a(x) { b = y; } ... ... int main () { Myclass obj1(2,3); const Myclass obj2(4,5); Myclass const obj3(6,7); obj1.display(); // OK obj2.display(); // OK obj3.display(); // OK obj1.show(); // OK obj2.show(); // ERROR obj3.show(); // ERROR } ex11_class_const.cpp
常引用 口常引用 const类名&引用名; ·常引用可以绑定到常对象,也可以绑定到普通对象 ●不能通过常引用来修改常引用所绑定的对象 ● 普通引用不能绑定到常对象 ex11 ref const.cpp 在C+编程中,经常用常指针和常引用作函数参数,这样既可以节省存储 量和运算时间,又能保证数据的安全。 http://math.ecnu.edu.cn/~jypan
http://math.ecnu.edu.cn/~jypan 7 常引用 常引用 常引用可以绑定到常对象,也可以绑定到普通对象 不能通过常引用来修改常引用所绑定的对象 普通引用不能绑定到常对象 const 类名 & 引用名; 在 C++ 编程中,经常用常指针和常引用作函数参数,这样既可以节省存储 量和运算时间,又能保证数据的安全。 ex11_ref_const.cpp
2 对象数组与对象指针 ■对象数组的声明与初始化 指向对象的指针、this指针 特殊符号:-> 指向成员的指针 持久内存分配:new、delete http://math.ecnu.edu.cn/-jypan 8
http://math.ecnu.edu.cn/~jypan 8 对象数组与对象指针 对象数组的声明与初始化 指向对象的指针、this 指针 特殊符号:-> 指向成员的指针 持久内存分配:new、delete 2
对象数组的声明与引用 类名数组名[n]; /声明 数组名[k].成员名; /1使用 口对象数组的初始化:对每个元素都调用构造函数 Example Point(){x=0;y=0} Point(int a,int b){x=a;y=b; int main() Point A[2]={Point(),Point(2,3); http://math
http://math.ecnu.edu.cn/~jypan ... .. Point() { x=0; y=0} Point(int a, int b) { x=a; y=b; } ... ... int main() { Point A[2]={Point(), Point(2,3); ... ... } 9 对象数组的声明与引用 对象数组的初始化:对每个元素都调用构造函数 类名 数组名[n]; // 声明 数组名[k].成员名; // 使用 Example
对象指针 对象指针:指向对象的指针,存放对象的地址 ▣对象指针的声明 类名*对象指针名; Point a(1,2); Example Point pa =&a; 口用对象指针访问对象成员:“->” 对象指针名->成员名 //对象指针特有方式,推荐使用 (*对象指针名).成员名/1普通方式 口指向常对象的指针:const类名*对象指针名; http://math.ecnu.edu.cn/~jypan 10
http://math.ecnu.edu.cn/~jypan 10 对象指针 用对象指针访问对象成员:“ -> ” 对象指针的声明 Point a(1,2); Point * pa = &a; 对象指针:指向对象的指针,存放对象的地址 类名 * 对象指针名; 对象指针名->成员名 // 对象指针特有方式,推荐使用 (*对象指针名).成员名 // 普通方式 指向常对象的指针:const 类名 * 对象指针名; Example
this指针 this指针: 隐含在非静态成员函数中的特殊指针,指向目的对象,由系统自动生成 >this指针是常指针 ·若局部作用域中存在与类成员同名的标识符,则可以通过this指针 访问目的对象的成员,如数据成员与局部变量同名。 当通过对象调用(非静态)成员函数时,系统会自动生成指向该对象的hs指针。 ↑非静态成员函数有this指针,而静态成员函数没有this指针。 http://math.ecnu.edu.cn/~jypan 11
http://math.ecnu.edu.cn/~jypan 11 this 指针 ► this 指针是常指针 ► 若局部作用域中存在与类成员同名的标识符,则可以通过 this 指针 访问目的对象的成员,如数据成员与局部变量同名。 this 指针: 隐含在非静态成员函数中的特殊指针,指向目的对象,由系统自动生成 † 非静态成员函数有 this 指针,而静态成员函数没有 this 指针。 † 当通过对象调用(非静态)成员函数 时,系统会自动生成指向该对象的 this 指针