程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineer

Size: px
Start display at page:

Download "程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineer"

Transcription

1 程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) dksun@seu.edu.cn 东南大学机械工程学院 School of Mechanical Engineering Southeast University Spring semester, 2019

2 牢记 80/20 定律 The Pareto Principle Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

3 提纲 1 类的静态成员 2 友元与友元函数 3 类的常量成员 4 mutable 类型 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

4 提纲 类的静态成员 1 类的静态成员 2 友元与友元函数 3 类的常量成员 4 mutable 类型 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

5 类的静态成员 类的静态成员 类的静态成员 : 类中被关键词 static 修饰的成员, 有两种 : 静态数据成员 静态成员函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

6 类的静态成员 类的静态成员 类的静态成员 : 类中被关键词 static 修饰的成员, 有两种 : 静态数据成员 类的普通数据成员 静态成员函数 一个类的不同对象, 其普通数据成员的存储空间是相互独立的 1 class Person // 数据成员 + 动作 2 { 3 private: 4 char name[20]; // 姓名 5 char gender; // 性别 6 int age; // 年龄 7 public: 8 void SetData(char [ ], char, int ); 9 void GetName(char *); 10 char GetGender( ); 11 int GetAge( ); 12 }; 13 Person ChengB("ChengBin", F, 20), ZhangJ("ZhangJie", M, 18); 类 Person 的两个对象 ChengB 和 ZhangJ 的内存空间是相互独立的 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

7 类的静态数据成员 类的静态成员 如果将类的一个数据成员定义成静态成员, 则这个类所有对象的该成员共用同一存储空间 1 class Sample 2 { 3 private: 4 int a, b, c ; 5 static int d ; // 声明静态数据成员, 但未定义 ( 需要初始化 ) }sa, sb, sc; 对象 sa sb sc 的数据成员 a b c 在内存空间是相互独立的, 而数据成员 d 是属于类 Sample 的, 不专属于任何对象 静态数据成员实际上 ( 本质上要看所在的内存分区 ) 是类域中的全局变量 因此, 类的静态数据成员的初始化 必须在类体外进行 : Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

8 类的静态数据成员 类的静态成员 如果将类的一个数据成员定义成静态成员, 则这个类所有对象的该成员共用同一存储空间 1 class Sample 2 { 3 private: 4 int a, b, c ; 5 static int d ; // 声明静态数据成员, 但未定义 ( 需要初始化 ) }sa, sb, sc; 对象 sa sb sc 的数据成员 a b c 在内存空间是相互独立的, 而数据成员 d 是属于类 Sample 的, 不专属于任何对象 静态数据成员实际上 ( 本质上要看所在的内存分区 ) 是类域中的全局变量 因此, 类的静态数据成员的初始化 必须在类体外进行 : Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

9 类的静态数据成员 类的静态成员 如果将类的一个数据成员定义成静态成员, 则这个类所有对象的该成员共用同一存储空间 1 class Sample 2 { 3 private: 4 int a, b, c ; 5 static int d ; // 声明静态数据成员, 但未定义 ( 需要初始化 ) }sa, sb, sc; 对象 sa sb sc 的数据成员 a b c 在内存空间是相互独立的, 而数据成员 d 是属于类 Sample 的, 不专属于任何对象 静态数据成员实际上 ( 本质上要看所在的内存分区 ) 是类域中的全局变量 因此, 类的静态数据成员的初始化 必须在类体外进行 : 8 int Sample::d(10); // 初始化, 直接初始化 (direct initialization) 或 8 int Sample::d = 10; // 初始化, 拷贝初始化 (copy initialization) Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

10 类的静态成员静态数据成员的使用 类的静态数据成员必须在类体外进行初始化 1 #include <iostream> 2 using namespace std; 3 class Sample 4 { 5 int n; 6 static int sum; // 静态成员 7 public: 8 Sample(int x) 9 { n=x; } 10 void add( ) const // 注意 11 { sum+=n; } 12 void disp( ) 13 { 14 cout<<"n="<<n<<",sum="<< sum<<endl; 15 } 16 }; 17 int Sample::sum = 0; // 初始化 18 int main( ) 19 { 22 Sample a(2), b(3), c(5); 23 a.add( ); a.disp( ); 24 b.add( ); b.disp( ); 25 c.add( ); c.disp( ); 26 cout <<"sizeof(a) : "<< sizeof(a)<<endl; 27 cout <<"sizeof(b) : "<< sizeof(b)<<endl; 28 cout <<"sizeof(c) : "<< sizeof(c)<<endl; 29 return 0; 30 } 程序运行结果是 : Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

11 类的静态成员静态数据成员的使用 类的静态数据成员必须在类体外进行初始化 1 #include <iostream> 2 using namespace std; 3 class Sample 4 { 5 int n; 6 static int sum; // 静态成员 7 public: 8 Sample(int x) 9 { n=x; } 10 void add( ) const // 注意 11 { sum+=n; } 12 void disp( ) 13 { 14 cout<<"n="<<n<<",sum="<< sum<<endl; 15 } 16 }; 17 int Sample::sum = 0; // 初始化 18 int main( ) 19 { 22 Sample a(2), b(3), c(5); 23 a.add( ); a.disp( ); 24 b.add( ); b.disp( ); 25 c.add( ); c.disp( ); 26 cout <<"sizeof(a) : "<< sizeof(a)<<endl; 27 cout <<"sizeof(b) : "<< sizeof(b)<<endl; 28 cout <<"sizeof(c) : "<< sizeof(c)<<endl; 29 return 0; 30 } 程序运行结果是 :n=2, sum=2 n=3, sum=5 n=5, sum=10 sizeof(a) : 4 sizeof(b) : 4 sizeof(c) : 4 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

12 类的静态成员静态数据成员的使用 类的静态数据成员必须在类体外进行初始化 1 #include <iostream> 如果将主函数改写为 2 using namespace std; 18 int main( ) 3 class Sample 19 { 4 { 20 Sample a(2), b(3), c(5); 5 int n; 21 a.add(); b.add(); c.add(); 6 static int sum; // 静态成员 22 a.disp();b.disp();c.disp(); 7 public: 23 return 0; 8 Sample(int x) 24 } 9 { n=x; } 10 void add( ) const // 注意程序运行结果是 : 11 { sum+=n; } 12 void disp( ) 13 { 14 cout<<"n="<<n<<",sum="<< sum<<endl; 15 } 16 }; 17 int Sample::sum = 0; // 初始化 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

13 类的静态成员静态数据成员的使用 类的静态数据成员必须在类体外进行初始化 1 #include <iostream> 如果将主函数改写为 2 using namespace std; 3 class Sample 4 { 5 int n; 6 static int sum; // 静态成员 7 public: 8 Sample(int x) 9 { n=x; } 10 void add( ) const // 注意 11 { sum+=n; } 12 void disp( ) 13 { 14 cout<<"n="<<n<<",sum="<< sum<<endl; 15 } 16 }; 17 int Sample::sum = 0; // 初始化 18 int main( ) 19 { 20 Sample a(2), b(3), c(5); 21 a.add(); b.add(); c.add(); 22 a.disp();b.disp();c.disp(); 23 return 0; 24 } 程序运行结果是 : n=2, sum=10 n=3, sum=10 n=5, sum=10 静态数据成员的全局性静态数据成员实际上是类域中的全局变量, 其定义 ( 初始化 ) 不应该被放在头文件中 ( 接口与实现分离 ) Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

14 类的静态成员静态数据成员的使用 类的静态数据成员必须在类体外进行初始化 1 #include <iostream> 如果将主函数改写为 2 using namespace std; 3 class Sample 4 { 5 int n; 6 static int sum; // 静态成员 7 public: 8 Sample(int x) 9 { n=x; } 10 void add( ) const // 注意 11 { sum+=n; } 12 void disp( ) 13 { 14 cout<<"n="<<n<<",sum="<< sum<<endl; 15 } 16 }; 17 int Sample::sum = 0; // 初始化 18 int main( ) 19 { 20 Sample a(2), b(3), c(5); 21 a.add(); b.add(); c.add(); 22 a.disp();b.disp();c.disp(); 23 return 0; 24 } 程序运行结果是 : n=2, sum=10 n=3, sum=10 n=5, sum=10 静态数据成员的全局性静态数据成员实际上是类域中的全局变量, 其定义 ( 初始化 ) 不应该被放在头文件中 ( 接口与实现分离 ) 静态数据成员可在 const 成员函数中被合法地改变, 而普通数据成员则不可 静态数据成员可作为类的成员函数的可选参数, 而普通数据成员则不可以 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

15 类的静态成员函数 类的静态成员 静态成员函数属于类, 就像静态数据成员属于类一样 静态成员函数不能访问非静态成员, 但可以访问静态成员 可以通过类名或对象名直接调用静态成员函数和数据成员 静态成员函数不能访问非静态成员, 但可以访问静态成员 1 class A 2 { 3 public: 4 A() 5 { } 6 static void test() 7 { m_a += 1; } // Error: invalid use of member A::m_a 8 void hello() 9 { } 10 private: 11 static int m_statica; 12 static A * m_ga; 13 int m_a; 14 }; 15 int main() 16 { return 0; } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

16 类的静态成员函数 类的静态成员 静态成员函数属于类, 就像静态数据成员属于类一样 静态成员函数不能访问非静态成员, 但可以访问静态成员 可以通过类名或对象名直接调用静态成员函数和数据成员 静态成员函数不能访问非静态成员, 但可以访问静态成员 1 class A 2 { 3 public: 4 A() 5 { m_ga = this; } // 把 this 指针赋值静态成员 6 static void test() 7 { m_ga->m_a += 1; } // Right: 在静态成员函数内部间接访问非静态成员 8 void hello() 9 { } 10 private: 11 static int m_statica; 12 static A * m_ga; 13 int m_a; 14 }; 15 int main() 16 { return 0; } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

17 类的静态成员函数 类的静态成员 静态成员函数的使用下面程序运行结果是? 1 #include <iostream> 2 using namespace std; 3 class Sample 4 { 5 int a; static int b; // 成员变量 静态数据成员 6 public: 7 static int c; 8 Sample(int x) { a=x; b+=x; } 9 static void disp(sample s) // 类体外的函数定义不能指定关键字 static 10 { cout<<"a="<<s.a<<", b="<<b<<endl; } 11 }; 12 int Sample::b = 10; int Sample::c = 20; // 静态数据成员初始化 13 int main( ) 14 { 15 Sample s1(2), s2(3); 16 Sample::disp(s1); // 可改写为 s1.disp(s1); 或 s2.disp(s1); 17 Sample::disp(s2); // 可改写为 s1.disp(s2); 或 s2.disp(s2); 18 cout<<"c="<<sample::c<<endl; // Sample::c 可改写为 s1.c 或 s2.c 19 return 0; 20 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

18 类的静态成员函数 类的静态成员 程序运行结果是 : Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

19 类的静态成员函数 类的静态成员 程序运行结果是 : a=2, b=15 a=3, b=15 c=20 关于静态成员的说明 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

20 类的静态成员函数 类的静态成员 程序运行结果是 : a=2, b=15 a=3, b=15 c=20 关于静态成员的说明 静态成员之间可以相互访问, 包括 :1) 类的静态成员函数访问类的静态数据成员 ;2) 类的静态成员函数调用类的静态成员函数 静态成员函数由同一类中的所有对象共用, 只能调用静态成员变量和静态成员函数 ; 而非静态成员函数可以任意地访问静态成员函数和静态数据成员 静态成员函数没有 this 指针, 它不能返回非静态成员 这是因为除了类的实例 ( 对象 ) 会调用它, 类本身也会调用它 静态成员函数与类的其他函数相比, 其调用效率略高 这是由于静态成员函数没有 this 指针带来的开销 静态成员函数在编译阶段获得存储空间, 故不能被定义为虚函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

21 类的静态成员函数 类的静态成员 程序运行结果是 : a=2, b=15 a=3, b=15 c=20 关于静态成员的说明 静态成员之间可以相互访问, 包括 :1) 类的静态成员函数访问类的静态数据成员 ;2) 类的静态成员函数调用类的静态成员函数 静态成员函数由同一类中的所有对象共用, 只能调用静态成员变量和静态成员函数 ; 而非静态成员函数可以任意地访问静态成员函数和静态数据成员 静态成员函数没有 this 指针, 它不能返回非静态成员 这是因为除了类的实例 ( 对象 ) 会调用它, 类本身也会调用它 静态成员函数与类的其他函数相比, 其调用效率略高 这是由于静态成员函数没有 this 指针带来的开销 静态成员函数在编译阶段获得存储空间, 故不能被定义为虚函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

22 类的静态成员函数 类的静态成员 程序运行结果是 : a=2, b=15 a=3, b=15 c=20 关于静态成员的说明 静态成员之间可以相互访问, 包括 :1) 类的静态成员函数访问类的静态数据成员 ;2) 类的静态成员函数调用类的静态成员函数 静态成员函数由同一类中的所有对象共用, 只能调用静态成员变量和静态成员函数 ; 而非静态成员函数可以任意地访问静态成员函数和静态数据成员 静态成员函数没有 this 指针, 它不能返回非静态成员 这是因为除了类的实例 ( 对象 ) 会调用它, 类本身也会调用它 静态成员函数与类的其他函数相比, 其调用效率略高 这是由于静态成员函数没有 this 指针带来的开销 静态成员函数在编译阶段获得存储空间, 故不能被定义为虚函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

23 类的静态成员类的静态成员 详解 可以通过类名调用静态成员函数, 但不能通过类名来调用类的非静态成员函数 1 class Point 2 { 3 public: 4 void init() 5 { 6 } 7 static void output() 8 { 9 } 10 }; 11 void main() 12 { 13 Point::init(); 14 Point::output(); 15 } 编译出错 :error C2352: Point::init : illegal call of non-static member function Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

24 类的静态成员类的静态成员 详解 可以通过类的对象调用静态成员函数和非静态成员函数 1 class Point 2 { 3 public: 4 void init() 5 { 6 } 7 static void output() 8 { 9 } 10 }; 11 void main() 12 { 13 Point pt; 14 pt.init(); // 调用非静态成员函数 15 pt.output(); // 调用静态成员函数 16 } 编译通过 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

25 类的静态成员类的静态成员 详解 类的静态成员函数不能调用类的非静态成员 1 class Point 2 { 3 public: 4 void init() { } 5 static void output() { printf("%d\n", m_x); } 6 private: 7 int m_x; 8 }; 9 void main() 10 { 11 Point pt; 12 pt.output(); 13 } 编译出错 :error C2597: illegal reference to data member Point::m_x in a static member function 因为静态成员函数属于整个类, 在类实例化对象之前就已经分配空间了, 而类的非静态成员必须在类实例化对象后才有内存空间, 所以这个调用就出错了, 就好比没有声明一个变量却提前使用它一样 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

26 类的静态成员类的静态成员 详解 类的非静态成员函数可以调用静态成员函数, 反之则不能 1 class Point 2 { 3 public: 4 Point() { m_npointcount++; } 5 ~Point() { m_npointcount--; } 6 static void output() { printf("%d\n", m_npointcount); } 7 private: 8 static int m_npointcount; 9 }; 10 void main() 11 { 12 Point pt; 13 pt.output(); 14 } 编译出错 :error LNK2001: unresolved external symbol "private: static int Point ::m_npointcount" (?m_npointcount@point@@0ha) 这是因为类的静态成员变量在使用前必须初始化 在 main() 函数前加上 int Point::m_nPointCount = 0; 再编译链接无错误, 运行程序将输出 1 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

27 静态成员详解 类的静态成员 类的静态成员变量使用前, 必须先对其进行初始化 1 class Point 2 { 3 public: 4 Point() { m_npointcount++; } 5 ~Point() { m_npointcount--; } 6 static void output() { printf("%d\n", m_npointcount); } 7 private: 8 static int m_npointcount; 9 }; 10 void main() 11 { 12 Point pt; 13 pt.output(); 14 } 编译无误, 但生成可执行文件时报链接错误 : error LNK2001: unresolved ext ernal symbol "private: static int Point::m_nPointCount"(?m_nPointCount@Po int@@0ha) 这是因为类的静态成员变量在使用前必须先初始化 在主函数前加上 int Point::m_nPointCount = 0; 再次编译链接则无误, 运行时输出 1 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

28 提纲 友元与友元函数 1 类的静态成员 2 友元与友元函数 3 类的常量成员 4 mutable 类型 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

29 类的友元函数 友元与友元函数 类的封装性和信息的隐蔽性在类内, 类的任意成员函数均能够访问类的私有成员 在类外, 只能由公有成员函数才能访问类的私有成员 通过公有成员函数接口访问私有成员 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

30 类的友元函数 友元与友元函数 类的封装性和信息的隐蔽性 在类内, 类的任意成员函数均能够访问类的私有成员 在类外, 只能由公有成员函数才能访问类的私有成员 通过公有成员函数接口访问私有成员 12 class Point 13 { 14 int x, y; 15 public: 16 Point(int a=0, int b=0) { x= a; y=b; } 17 ~Point() { } 18 void Show( ) { cout<<"point( "<<x<<, <<y<<")\n"; } 19 int Getx( ) { return x; } 20 int Gety( ) { return y; } 21 }p1, p2(1,1); 22 double distance(point &p1, Point &p2 )//normal 1 { // 2 return sqrt( 3 (p1.getx( )-p2.getx( )) *(p1.getx( )-p2.getx( )) 4 + (p1.gety( )-p2.gety( )) *(p1.gety( )-p2.gety( )) 5 ); 6 } 7 int main( ) 8 { 9 cout << distance(p1, p2) << endl; 10 return 0; 11 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

31 类的友元函数 友元与友元函数 类的封装性和信息的隐蔽性 在类内, 类的任意成员函数均能够访问类的私有成员 在类外, 只能由公有成员函数才能访问类的私有成员 通过公有成员函数接口访问私有成员 12 class Point 13 { 14 int x, y; 15 public: 16 Point(int a=0, int b=0) { x= a; y=b; } 17 ~Point() { } 18 void Show( ) { cout<<"point( "<<x<<, <<y<<")\n"; } 19 int Getx( ) { return x; } 20 int Gety( ) { return y; } 21 }p1, p2(1,1); 22 double distance(point &p1, Point &p2 )//normal 1 { // 多次调用公有函数, 开销较大 2 return sqrt( 3 (p1.getx( )-p2.getx( )) *(p1.getx( )-p2.getx( )) 4 + (p1.gety( )-p2.gety( )) *(p1.gety( )-p2.gety( )) 5 ); 6 } 7 int main( ) 8 { 9 cout << distance(p1, p2) << endl; 10 return 0; 11 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

32 类的友元函数 友元与友元函数 类的封装性和信息的隐蔽性 在类内, 类的任意成员函数均能够访问类的私有成员 在类外, 只能由公有成员函数才能访问类的私有成员 通过公有成员函数接口访问私有成员 12 class Point 13 { 14 int x, y; 15 public: 16 Point(int a=0, int b=0) { x= a; y=b; } 17 ~Point() { } 18 void Show( ) { cout<<"point( "<<x<<, <<y<<")\n"; } 19 int Getx( ) { return x; } 20 int Gety( ) { return y; } 21 }p1, p2(1,1); 22 double distance(point &p1, Point &p2 )//normal 1 { // 多次调用公有函数, 开销较大 2 return sqrt( 3 (p1.getx( )-p2.getx( )) *(p1.getx( )-p2.getx( )) 4 + (p1.gety( )-p2.gety( )) *(p1.gety( )-p2.gety( )) 5 ); 6 } 7 int main( ) 8 { 9 cout << distance(p1, p2) << endl; 10 return 0; 11 } 有没有办法在普通函数 distance() 中直接访问 Point 的私有成员呢? Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

33 类的友元函数 友元与友元函数 Solution 类的封装性和信息的隐蔽性回答是肯定的在类内, 类的任意成员函数均能够访问类的私有成员 : 有! 只需将函数 distance( ) 说明为类 Point 的友元 (friend) 函数! 在类外, 只能由公有成员函数才能访问类的私有成员 通过公有成员函数接口访问私有成员 12 class Point 13 { 14 int x, y; 15 public: 16 Point(int a=0, int b=0) { x= a; y=b; } 17 ~Point() { } 18 void Show( ) { cout<<"point( "<<x<<, <<y<<")\n"; } 19 int Getx( ) { return x; } 20 int Gety( ) { return y; } 21 }p1, p2(1,1); 22 double distance(point &p1, Point &p2 )//normal 1 { // 多次调用公有函数, 开销较大 2 return sqrt( 3 (p1.getx( )-p2.getx( )) *(p1.getx( )-p2.getx( )) 4 + (p1.gety( )-p2.gety( )) *(p1.gety( )-p2.gety( )) 5 ); 6 } 7 int main( ) 8 { 9 cout << distance(p1, p2) << endl; 10 return 0; 11 } 有没有办法在普通函数 distance() 中直接访问 Point 的私有成员呢? Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

34 类的友元函数 友元与友元函数 友元函数的定义方法是 : 1 class A 2 { friend void fun(...); // 说明函数 fun( ) 是类 A 的友元函数 5 }; 6 void fun(...) 7 { class A a; // 于是在此函数中, 可以直接访问类 A 的私有成员 10 } 将前文的程序代码修改为 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

35 类的友元函数 友元与友元函数 友元函数的定义方法是 : 1 class A 2 { friend void fun(...); // 说明函数 fun( ) 是类 A 的友元函数 5 }; 6 void fun(...) 7 { class A a; // 于是在此函数中, 可以直接访问类 A 的私有成员 10 } 将前文的程序代码修改为 1 class Point 2 { 3 int x, y; 4 public: friend double distance(point&, Point& ); // 修改之处, 也可以将主函数 main 声明为一个类的友元函数 7 }; Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

36 类的友元函数 友元与友元函数 8 double distance(point &p1, Point &p2 ) 9 { 10 // 修改之处 11 return sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ); 12 } 13 int main( ) // 也可以将主函数 main 声明为一个类的友元函数 14 { 15 Point p1, p2(1,1); 16 cout<<distance(p1,p2)<<endl; 17 return 0; 18 } 关于友元函数的几点说明 : Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

37 类的友元函数 友元与友元函数 8 double distance(point &p1, Point &p2 ) 9 { 10 // 修改之处 11 return sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ); 12 } 13 int main( ) // 也可以将主函数 main 声明为一个类的友元函数 14 { 15 Point p1, p2(1,1); 16 cout<<distance(p1,p2)<<endl; 17 return 0; 18 } 关于友元函数的几点说明 : 友元函数不是类的成员函数, 访问权限不能限制友元函数 友元函数的说明可放在 private public protected 的任意段中 友元函数可以在类外直接访问包含私有和保护成员在内的所有成员 友元函数可提高程序的运行效率, 但破坏了类中信息的隐蔽性 友元函数破坏了类的封装性, 要慎用友元函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

38 类的友元函数 友元与友元函数 普通函数可以做友元函数, 类的成员函数也可以作为其他类的友元函数 1 class N; // 为什么用引用性声明? 2 class M 3 { 4 int a, b; 5 public: 6 M(int x, int y) 7 { a=x; b=y; } 8 void Print( ) 9 { 10 cout<<"a="<<a<< \t <<"b= "<<b<<endl; 11 } 12 void Setab(N &);// 类 M 的成员 13 }; 14 class N 15 { 16 int c, d; 17 public: 18 N(int a, int b) 19 { c=a; d=b; } 18 void Print( ) 19 { 20 cout<<"c="<<c<< \t <<"d= "<<d<<endl; 21 } 22 friend void M::Setab(N&); // 将 M 类的成员函数说明成类 N 的友 元 它可直接访问类 N 的所有成员 23 }; 24 void M::Setab(N &obj) // 类 N 的友元, 可直接访问类 N 的所有成员 25 { a = obj.c; b = obj.d; } 26 int main( ) 27 { 28 M m(25, 40); N n(55, 66); 29 m.setab(n); m.print(); 30 return 0; 31 } 请问 : 程序运行结果是什么? Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

39 类的友元函数 友元与友元函数 Solution 普通函数可以做友元函数, 类的成员函数也可以作为其他类的友元函数 程序运行结果是 1 class N; // 为什么用引用性声明 : a=55 b=66? 18 void Print( ) 2 class M 19 { 3 { 20 cout<<"c="<<c<< \t <<"d= 4 int a, b; "<<d<<endl; 5 public: 21 } 6 M(int x, int y) 22 friend void M::Setab(N&); // 7 { a=x; b=y; } 将 M 类的成员函数说明成类 N 的友 8 void Print( ) 元 它可直接访问类 N 的所有成员 9 { 23 }; 10 cout<<"a="<<a<< \t <<"b= "<<b<<endl; 24 void M::Setab(N &obj) // 类 N 的友元, 可直接访问类 N 的所有成员 11 } 25 { a = obj.c; b = obj.d; } 12 void Setab(N &);// 类 M 的成员 26 int main( ) 13 }; 27 { 14 class N 28 M m(25, 40); N n(55, 66); 15 { 29 m.setab(n); m.print(); 16 int c, d; 30 return 0; 17 public: 31 } 18 N(int a, int b) 19 { c=a; d=b; } 请问 : 程序运行结果是什么? Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

40 类的友元函数 友元与友元函数 Solution 普通函数可以做友元函数, 类的成员函数也可以作为其他类的友元函数 程序运行结果是 1 class N; // 为什么用引用性声明 : a=55 b=66? 请运行 FriendMemberFunction.cpp 18 void Print( ) 2 class M 19 { 3 { 20 cout<<"c="<<c<< \t <<"d= 4 int a, b; "<<d<<endl; 5 public: 21 } 6 M(int x, int y) 22 friend void M::Setab(N&); // 7 { a=x; b=y; } 将 M 类的成员函数说明成类 N 的友 8 void Print( ) 元 它可直接访问类 N 的所有成员 9 { 23 }; 10 cout<<"a="<<a<< \t <<"b= "<<b<<endl; 24 void M::Setab(N &obj) // 类 N 的友元, 可直接访问类 N 的所有成员 11 } 25 { a = obj.c; b = obj.d; } 12 void Setab(N &);// 类 M 的成员 26 int main( ) 13 }; 27 { 14 class N 28 M m(25, 40); N n(55, 66); 15 { 29 m.setab(n); m.print(); 16 int c, d; 30 return 0; 17 public: 31 } 18 N(int a, int b) 19 { c=a; d=b; } 请问 : 程序运行结果是什么? Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

41 友元与友元函数从友元函数到友元类 友元的意义 友元函数提供了在不同类成员函数之间 类的成员函数与一般函数之间数据共享的机制 通过友元函数, 一个普通的函数可以获得与成员函数相同的待遇 例如, 当做矩阵和向量的乘法运算时, 矩阵类和向量类分别为 Matrix 和 Vetor 此时, 乘法操作的函数只能是普通函数 这是因为, 一个函数不可能既是变个类的成员又是那个类的成员 这就必须通过友元来处理此类算法以避免频繁的调用成员函数, 从而提高程序的运行效率 友元类 一个友元可以是函数也可以是一个类 如果是函数, 则该函数叫友元函数 ; 如果是类, 则该类叫友元类 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

42 友元类 友元与友元函数 一个类可以作为另一个类的友元 当一个类作为另一个类的友元时, 就意味着 : 这个类的所有成员函数都是另一个类的友元函数 如果类 B 是类 A 的友元, 则类 B 所有的成员函数均可以访问类 A 的所有 ( 含私有 ) 成员 1 class B; 2 class A 3 { 4 int i,j,k; // 类 A 的私有成员 5 void funcina( ); // 类 A 的成员函数, 不可访问类 B 的私有成员 6 friend class B; // B 类是 A 类的友元 7 }; 8 class B 9 { 10 int x,y,z; // 类 B 的私有成员 11 public: 12 void funcinb( ); // 可访问类 A 的私有成员 13 }; 如果类 B 是类 A 的友元, 但类 A 不是类 B 的友元, 则类 A 的成员函数未必可以访问类 B 的私有成员 未必 : 类 A 与类 B 可能存在继承与派生等其他关系 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

43 友元类 友元与友元函数 将一个类说明为另一个类的友元类 1 #include <iostream> 2 using namespace std; 3 4 class B; // 引用性声明 5 class A 6 { 7 int x; 8 void Disp( ) 9 { 10 cout<<"x="<<x<<endl; 11 } 12 friend B; // 声明 B 是 A 的友元类 13 }; class B 16 { 17 public: 程序运行结果 : 18 void Set(int n) 19 { 20 A a; 21 a.x = n; // 可访问 A 类对 象的私有数据成员 x 22 a.disp( ); // 可访问 A 类对 象的私有成员函数 disp( ) 23 } 24 }; int main(void) 27 { 28 B b; 29 b.set(3); return 0; 32 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

44 友元类 友元与友元函数 将一个类说明为另一个类的友元类 1 #include <iostream> 2 using namespace std; 3 4 class B; // 引用性声明 5 class A 6 { 7 int x; 8 void Disp( ) 9 { 10 cout<<"x="<<x<<endl; 11 } 12 friend B; // 声明 B 是 A 的友元类 13 }; class B 16 { 17 public: 程序运行结果 :x=3 18 void Set(int n) 19 { 20 A a; 21 a.x = n; // 可访问 A 类对 象的私有数据成员 x 22 a.disp( ); // 可访问 A 类对 象的私有成员函数 disp( ) 23 } 24 }; int main(void) 27 { 28 B b; 29 b.set(3); return 0; 32 } 这表明 : 类 B 所有的成员函数均可访问类 A 中包含私有成员在内的所有成员 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

45 提纲 类的常量成员 1 类的静态成员 2 友元与友元函数 3 类的常量成员 4 mutable 类型 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

46 类的常量成员常量数据成员和常量成员函数 私有数据成员可以通过公有成员函数接口修改 为了保证部分私有数据成员不被修改,C++ 提供了自动保护私有数据成员的机制, 即常数据成员和常成员函数 常量数据成员 方法是在类体中定义数据成员时, 在前面加上关键字 const 1 class Point 2 { 3 int x, y; // 点的坐标 4 const int color; // 点的颜色,color 是常数据成员 5 public: 6 Point(int a=0, int b=0, int c=0): color(c) 7 { 8 x = a; y = b; 9 } 10 }; 以上代码,color 的初始化只能通过构造函数的成员初始化列表实现 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

47 类的常量成员常量数据成员和常量成员函数 常量成员函数 常量成员函数的定义方法 : 在函数头尾部 参数的右括号后加关键词 const Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

48 类的常量成员常量数据成员和常量成员函数 常量成员函数 常量成员函数的定义方法 : 在函数头尾部 参数的右括号后加关键词 const 关于常量成员函数的说明 常量成员函数可以访问类的所有成员, 但不能修改任何数据成员 ( 含常量数据成员 ) 的值 普通成员函数可以访问类的所有成员, 但不能修改常量数据成员, 但是能修改除常量数据成员外的其他数据成员的值 关键词 const 是函数类型的一部分, 在声明和定义常成员函数时都要加关键字 const, 而且 const 也参与重载函数的区分 常对象只能调用常成员函数 常量成员函数就是声明自己不会修改被操作对象的常数, 因为你的变量不允许修改内容, 所以只能调用不会修改内容的常量成员函数 如果调用其它函数就有可能修改变量的内容, 所以这是不允许的 常量成员函数不能调用另一个非 const 成员函数 如果调用了, 则常量成员函数可能通过非 const 成员函数修改数据成员的值 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

49 类的常量成员常量数据成员和常量成员函数 常量成员函数 常量成员函数的定义方法 : 在函数头尾部 参数的右括号后加关键词 const 关于常量成员函数的说明 常量成员函数可以访问类的所有成员, 但不能修改任何数据成员 ( 含常量数据成员 ) 的值 普通成员函数可以访问类的所有成员, 但不能修改常量数据成员, 但是能修改除常量数据成员外的其他数据成员的值 关键词 const 是函数类型的一部分, 在声明和定义常成员函数时都要加关键字 const, 而且 const 也参与重载函数的区分 常对象只能调用常成员函数 常量成员函数就是声明自己不会修改被操作对象的常数, 因为你的变量不允许修改内容, 所以只能调用不会修改内容的常量成员函数 如果调用其它函数就有可能修改变量的内容, 所以这是不允许的 常量成员函数不能调用另一个非 const 成员函数 如果调用了, 则常量成员函数可能通过非 const 成员函数修改数据成员的值 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

50 类的常量成员常量数据成员和常量成员函数 常量成员函数 常量成员函数的定义方法 : 在函数头尾部 参数的右括号后加关键词 const 关于常量成员函数的说明 常量成员函数可以访问类的所有成员, 但不能修改任何数据成员 ( 含常量数据成员 ) 的值 普通成员函数可以访问类的所有成员, 但不能修改常量数据成员, 但是能修改除常量数据成员外的其他数据成员的值 关键词 const 是函数类型的一部分, 在声明和定义常成员函数时都要加关键字 const, 而且 const 也参与重载函数的区分 常对象只能调用常成员函数 常量成员函数就是声明自己不会修改被操作对象的常数, 因为你的变量不允许修改内容, 所以只能调用不会修改内容的常量成员函数 如果调用其它函数就有可能修改变量的内容, 所以这是不允许的 常量成员函数不能调用另一个非 const 成员函数 如果调用了, 则常量成员函数可能通过非 const 成员函数修改数据成员的值 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

51 类的常量成员常量数据成员和常量成员函数 常量成员函数 常量成员函数的定义方法 : 在函数头尾部 参数的右括号后加关键词 const 关于常量成员函数的说明 常量成员函数可以访问类的所有成员, 但不能修改任何数据成员 ( 含常量数据成员 ) 的值 普通成员函数可以访问类的所有成员, 但不能修改常量数据成员, 但是能修改除常量数据成员外的其他数据成员的值 关键词 const 是函数类型的一部分, 在声明和定义常成员函数时都要加关键字 const, 而且 const 也参与重载函数的区分 常对象只能调用常成员函数 常量成员函数就是声明自己不会修改被操作对象的常数, 因为你的变量不允许修改内容, 所以只能调用不会修改内容的常量成员函数 如果调用其它函数就有可能修改变量的内容, 所以这是不允许的 常量成员函数不能调用另一个非 const 成员函数 如果调用了, 则常量成员函数可能通过非 const 成员函数修改数据成员的值 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

52 类的常量成员常量数据成员和常量成员函数 常量成员函数 常量成员函数的定义方法 : 在函数头尾部 参数的右括号后加关键词 const 关于常量成员函数的说明 常量成员函数可以访问类的所有成员, 但不能修改任何数据成员 ( 含常量数据成员 ) 的值 普通成员函数可以访问类的所有成员, 但不能修改常量数据成员, 但是能修改除常量数据成员外的其他数据成员的值 关键词 const 是函数类型的一部分, 在声明和定义常成员函数时都要加关键字 const, 而且 const 也参与重载函数的区分 常对象只能调用常成员函数 常量成员函数就是声明自己不会修改被操作对象的常数, 因为你的变量不允许修改内容, 所以只能调用不会修改内容的常量成员函数 如果调用其它函数就有可能修改变量的内容, 所以这是不允许的 常量成员函数不能调用另一个非 const 成员函数 如果调用了, 则常量成员函数可能通过非 const 成员函数修改数据成员的值 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

53 类的常量成员常量数据成员和常量成员函数 常量成员函数 常量成员函数的定义方法 : 在函数头尾部 参数的右括号后加关键词 const 关于常量成员函数的说明 常量成员函数可以访问类的所有成员, 但不能修改任何数据成员 ( 含常量数据成员 ) 的值 普通成员函数可以访问类的所有成员, 但不能修改常量数据成员, 但是能修改除常量数据成员外的其他数据成员的值 关键词 const 是函数类型的一部分, 在声明和定义常成员函数时都要加关键字 const, 而且 const 也参与重载函数的区分 常对象只能调用常成员函数 常量成员函数就是声明自己不会修改被操作对象的常数, 因为你的变量不允许修改内容, 所以只能调用不会修改内容的常量成员函数 如果调用其它函数就有可能修改变量的内容, 所以这是不允许的 常量成员函数不能调用另一个非 const 成员函数 如果调用了, 则常量成员函数可能通过非 const 成员函数修改数据成员的值 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

54 类的常量成员常量数据成员和常量成员函数 常量成员函数和一般成员函数对常量数据成员和一般数据成员的访问 1 #include <iostream> 2 using namespace std; 3 class Point // 注意类中的两个 fun( ) 函数是不同的函数 4 { 5 int x; // 普通数据成员 6 const int y; // 常量数据成员 7 public: 8 Point(int a=0, int b=0): x(a), y(b) { } // 默认构造函数 9 int fun( ) // 一般成员函数 10 { 11 x = 5; // 修改一般数据成员 x, 合法 12 y = 6; // 修改常量数据成员, 非法 13 return x+y; // 访问 x 和 y 合法 14 } 15 int fun( ) const // 常量成员函数, 相当 const this 指针作函数参数 16 { 17 x = 5; // 修改一般数据成员, 非法 18 y = 6; // 修改常量数据成员, 非法 19 return x+y; // 访问 x 和 y, 合法 20 } 21 }; Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

55 类的常量成员常量数据成员和常量成员函数 关键词 const 参与区分重载函数 ; 常量对象调用常量成员函数 1 #include <iostream> 2 using namespace std; 3 class Point 4 { 5 int x; const int y; 6 public: 7 Point(int a=0, int b=0): x(a), y(b) { } 8 int fun( ); // 第 1 个 fun 函数 9 int fun( ) const; // 第 2 个 fun 函数, 类中声明有 const 10 }; 11 int Point::fun( ) 12 { return x+y; } 13 int Point::fun( ) const // 类外定义也必须有 const 14 { return x-y; } 15 int main( ) 16 { 17 Point p1(1,8); const Point p2(1,8); 18 // 19 cout<<p1.fun( )<<", "<<p2.fun( )<<endl; 20 return 0; 21 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

56 类的常量成员常量数据成员和常量成员函数 关键词 const 参与区分重载函数 ; 常量对象调用常量成员函数 1 #include <iostream> 2 using namespace std; 3 class Point 4 { 5 int x; const int y; 6 public: 7 Point(int a=0, int b=0): x(a), y(b) { } 8 int fun( ); // 第 1 个 fun 函数 9 int fun( ) const; // 第 2 个 fun 函数, 类中声明有 const 10 }; 11 int Point::fun( ) 12 { return x+y; } 13 int Point::fun( ) const // 类外定义也必须有 const 14 { return x-y; } 15 int main( ) 16 { 17 Point p1(1,8); const Point p2(1,8); 18 // p1 调用的是第 1 个 fun 函数 ;p2 调用的是第 2 个 fun 函数, 即常量函数 19 cout<<p1.fun( )<<", "<<p2.fun( )<<endl; 20 return 0; 21 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

57 类的常量成员常量数据成员和常量成员函数 程序的运行结果关键词 const 参与区分重载函数 ; 常量对象调用常量成员函数 9, -7 1 #include <iostream> 2 using namespace std; 3 class Point 4 { 5 int x; const int y; 6 public: 7 Point(int a=0, int b=0): x(a), y(b) { } 8 int fun( ); // 第 1 个 fun 函数 9 int fun( ) const; // 第 2 个 fun 函数, 类中声明有 const 10 }; 11 int Point::fun( ) 12 { return x+y; } 13 int Point::fun( ) const // 类外定义也必须有 const 14 { return x-y; } 15 int main( ) 16 { 17 Point p1(1,8); const Point p2(1,8); 18 // p1 调用的是第 1 个 fun 函数 ;p2 调用的是第 2 个 fun 函数, 即常量函数 19 cout<<p1.fun( )<<", "<<p2.fun( )<<endl; 20 return 0; 21 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

58 类的常量成员常量数据成员和常量成员函数 可以通过普通对象调用常量成员函数 1 #include <iostream> 2 using namespace std; 3 class Point 4 { 5 int x; const int y; 6 public: 7 Point(int a=0, int b=0): x(a), y(b) { } 8 //int fun( ); // 第 1 个 fun 函数 9 int fun( ) const; // 第 2 个 fun 函数, 类中声明有 const 10 }; 11 //int Point::fun( ) 12 //{ return x+y; } 13 int Point::fun( ) const // 类外定义也必须有 const 14 { return x-y; } 15 int main( ) 16 { 17 Point p1(1,8); const Point p2(1,8); 18 // 19 cout<<p1.fun( )<<", "<<p2.fun( )<<endl; 20 return 0; 21 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

59 类的常量成员常量数据成员和常量成员函数 可以通过普通对象调用常量成员函数 1 #include <iostream> 2 using namespace std; 3 class Point 4 { 5 int x; const int y; 6 public: 7 Point(int a=0, int b=0): x(a), y(b) { } 8 //int fun( ); // 第 1 个 fun 函数 9 int fun( ) const; // 第 2 个 fun 函数, 类中声明有 const 10 }; 11 //int Point::fun( ) 12 //{ return x+y; } 13 int Point::fun( ) const // 类外定义也必须有 const 14 { return x-y; } 15 int main( ) 16 { 17 Point p1(1,8); const Point p2(1,8); 18 // p1 调用的是第 2 个 fun 函数 ;p2 调用的是第 2 个 fun 函数, 即常量函数 19 cout<<p1.fun( )<<", "<<p2.fun( )<<endl; 20 return 0; 21 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

60 类的常量成员常量数据成员和常量成员函数 程序的运行结果可以通过普通对象调用常量成员函数 -7, -7 1 #include <iostream> 2 using namespace std; 3 class Point 4 { 5 int x; const int y; 6 public: 7 Point(int a=0, int b=0): x(a), y(b) { } 8 //int fun( ); // 第 1 个 fun 函数 9 int fun( ) const; // 第 2 个 fun 函数, 类中声明有 const 10 }; 11 //int Point::fun( ) 12 //{ return x+y; } 13 int Point::fun( ) const // 类外定义也必须有 const 14 { return x-y; } 15 int main( ) 16 { 17 Point p1(1,8); const Point p2(1,8); 18 // p1 调用的是第 2 个 fun 函数 ;p2 调用的是第 2 个 fun 函数, 即常量函数 19 cout<<p1.fun( )<<", "<<p2.fun( )<<endl; 20 return 0; 21 } Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

61 提纲 mutable 类型 1 类的静态成员 2 友元与友元函数 3 类的常量成员 4 mutable 类型 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

62 mutable 类型关键词 mutable 的用法 扩展 突破 const 函数的限制 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

63 mutable 类型关键词 mutable 的用法 扩展 突破 const 函数的限制 若需要修改常对象中的某个数据成员, 可将数据成员定义为 mutable 类型 mutable 是为了突破 const 函数的限制而设置的 : 即使在一个 const 函数中, 被 mutable 修饰的变量, 将永远处于可变的状态 关键词 mutable 的意义 关键词 const 意思是 这个函数不修改对象的内部状态 为了保证这一点, 编译器也会主动替你检查, 确保你没有修改对象成员变量 否则内部状态就变了 关键词 mutable 意思是 这个成员变量不影响对象的内部状态 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

64 mutable 类型关键词 mutable 的用法 扩展 突破 const 函数的限制 若需要修改常对象中的某个数据成员, 可将数据成员定义为 mutable 类型 mutable 是为了突破 const 函数的限制而设置的 : 即使在一个 const 函数中, 被 mutable 修饰的变量, 将永远处于可变的状态 关键词 mutable 的意义 关键词 const 意思是 这个函数不修改对象的内部状态 为了保证这一点, 编译器也会主动替你检查, 确保你没有修改对象成员变量 否则内部状态就变了 关键词 mutable 意思是 这个成员变量不影响对象的内部状态 关键词 mutable 的用法 为调试程序, 编程者在常函数中定义一个变量用于统计某对象的访问次数 编译器并不知道该变量并不影响对象的其他功用, 会阻止在声明为 const 的函数中修改这个变量的行为 如果把这个计数变量声明为 mutable, 编译器就明白了 : 这个变量不影响对象的内部状态 并不影响 const 语义, 就不需要禁止 const 函数修改它 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

65 mutable 类型关键词 mutable 的用法 扩展 1 #include <iostream> 2 using namespace std; 3 class TestMutable 4 { 5 public: 6 TestMutable(){i=0;} 7 int Output() const 8 { 9 return i++; // error C2166: l-value specifies const object 10 } 11 private: 12 int i; 13 }; int main() 16 { 17 TestMutable testmutable; 18 cout << testmutable.output() << endl; 19 return 0; 20 } 显然 i++ 在 const 修饰的函数里是编译通不过的 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

66 mutable 类型关键词 mutable 的用法 扩展 1 #include <iostream> 2 using namespace std; 3 class TestMutable 4 { 5 public: 6 TestMutable(){i=0;} 7 int Output() const 8 { 9 return i++; 10 } 11 private: 12 mutable int i; // 请分析关键词 mutable 的作用 13 }; int main() 16 { 17 TestMutable testmutable; 18 cout << testmutable.output() << endl; 19 return 0; 20 } 在 int i 前面加上 mutable 上面就能编译通过了 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

67 提纲 总结与思考 1 类的静态成员 2 友元与友元函数 3 类的常量成员 4 mutable 类型 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

68 总结与思考 总结与思考 选择题 1. 下面各函数中,( ) 不是类的成员函数 A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 2. 下面有关静态数据成员的描述中,( ) 是错误的 A. 定义静态数据成员时, 前面要加关键字 static B. 静态数据成员要在类体外进行初始化 C. 在类外访问公有静态数据成员时, 要在静态数据成员名前加 < 类名 > 和作用域运算符 D. 静态数据成员不是所属类的所有对象共有的 3. 下面有关友元函数的描述中, 错误的是 ( ) A. 友元函数不是成员函数 B. 友元函数加强了类的封装性 C. 在友元函数中可以访问所属类的私有成员 D. 友元函数的作用是提高程序的执行效率 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

69 总结与思考 总结与思考 选择题 1. 下面各函数中,( C ) 不是类的成员函数 A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 2. 下面有关静态数据成员的描述中,( ) 是错误的 A. 定义静态数据成员时, 前面要加关键字 static B. 静态数据成员要在类体外进行初始化 C. 在类外访问公有静态数据成员时, 要在静态数据成员名前加 < 类名 > 和作用域运算符 D. 静态数据成员不是所属类的所有对象共有的 3. 下面有关友元函数的描述中, 错误的是 ( ) A. 友元函数不是成员函数 B. 友元函数加强了类的封装性 C. 在友元函数中可以访问所属类的私有成员 D. 友元函数的作用是提高程序的执行效率 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

70 总结与思考 总结与思考 选择题 1. 下面各函数中,( C ) 不是类的成员函数 A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 2. 下面有关静态数据成员的描述中,( D ) 是错误的 A. 定义静态数据成员时, 前面要加关键字 static B. 静态数据成员要在类体外进行初始化 C. 在类外访问公有静态数据成员时, 要在静态数据成员名前加 < 类名 > 和作用域运算符 D. 静态数据成员不是所属类的所有对象共有的 3. 下面有关友元函数的描述中, 错误的是 ( ) A. 友元函数不是成员函数 B. 友元函数加强了类的封装性 C. 在友元函数中可以访问所属类的私有成员 D. 友元函数的作用是提高程序的执行效率 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

71 总结与思考 总结与思考 选择题 1. 下面各函数中,( C ) 不是类的成员函数 A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 2. 下面有关静态数据成员的描述中,( D ) 是错误的 A. 定义静态数据成员时, 前面要加关键字 static B. 静态数据成员要在类体外进行初始化 C. 在类外访问公有静态数据成员时, 要在静态数据成员名前加 < 类名 > 和作用域运算符 D. 静态数据成员不是所属类的所有对象共有的 3. 下面有关友元函数的描述中, 错误的是 ( B ) A. 友元函数不是成员函数 B. 友元函数加强了类的封装性 C. 在友元函数中可以访问所属类的私有成员 D. 友元函数的作用是提高程序的执行效率 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

72 总结与思考 总结与思考 4. 下述关于成员函数特征的描述中, 错误的是 ( ) A. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置参数的缺省值 D. 成员函数可以是静态的 5. 对 C++ 编译器区分重载成员函数无任何意义的信息是 ( ) A. 参数类型 B. 参数个数 C. 返回值类型 D. 关键词 const 编程题 6. 定义一个复数类 Complex, 数据成员包括实部和虚部 成员函数包括 :1) 设置实部值,2) 设置虚部值,3) 读取 / 返回实部值,4) 读取 / 返回虚部值,5) 输出复数 在主函数中定义这个复数类的一个对象, 然后对所有成员函数进行测试, 即调用所有成员函数 7. 为上述题目的复数类增加一个友元函数 该友元函数的原型为 void print (Complex &), 用于输出一个复数对象 在主函数中自行设计程序代码以测试该函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

73 总结与思考 总结与思考 4. 下述关于成员函数特征的描述中, 错误的是 ( A ) A. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置参数的缺省值 D. 成员函数可以是静态的 5. 对 C++ 编译器区分重载成员函数无任何意义的信息是 ( ) A. 参数类型 B. 参数个数 C. 返回值类型 D. 关键词 const 编程题 6. 定义一个复数类 Complex, 数据成员包括实部和虚部 成员函数包括 :1) 设置实部值,2) 设置虚部值,3) 读取 / 返回实部值,4) 读取 / 返回虚部值,5) 输出复数 在主函数中定义这个复数类的一个对象, 然后对所有成员函数进行测试, 即调用所有成员函数 7. 为上述题目的复数类增加一个友元函数 该友元函数的原型为 void print (Complex &), 用于输出一个复数对象 在主函数中自行设计程序代码以测试该函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

74 总结与思考 总结与思考 4. 下述关于成员函数特征的描述中, 错误的是 ( A ) A. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置参数的缺省值 D. 成员函数可以是静态的 5. 对 C++ 编译器区分重载成员函数无任何意义的信息是 ( C ) A. 参数类型 B. 参数个数 C. 返回值类型 D. 关键词 const 编程题 6. 定义一个复数类 Complex, 数据成员包括实部和虚部 成员函数包括 :1) 设置实部值,2) 设置虚部值,3) 读取 / 返回实部值,4) 读取 / 返回虚部值,5) 输出复数 在主函数中定义这个复数类的一个对象, 然后对所有成员函数进行测试, 即调用所有成员函数 7. 为上述题目的复数类增加一个友元函数 该友元函数的原型为 void print (Complex &), 用于输出一个复数对象 在主函数中自行设计程序代码以测试该函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

75 总结与思考 总结与思考 4. 下述关于成员函数特征的描述中, 错误的是 ( A ) A. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置参数的缺省值 D. 成员函数可以是静态的 5. 对 C++ 编译器区分重载成员函数无任何意义的信息是 ( C ) A. 参数类型 B. 参数个数 C. 返回值类型 D. 关键词 const 编程题 6. 定义一个复数类 Complex, 数据成员包括实部和虚部 成员函数包括 :1) 设置实部值,2) 设置虚部值,3) 读取 / 返回实部值,4) 读取 / 返回虚部值,5) 输出复数 在主函数中定义这个复数类的一个对象, 然后对所有成员函数进行测试, 即调用所有成员函数 7. 为上述题目的复数类增加一个友元函数 该友元函数的原型为 void print (Complex &), 用于输出一个复数对象 在主函数中自行设计程序代码以测试该函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

76 总结与思考 总结与思考 4. 下述关于成员函数特征的描述中, 错误的是 ( A ) A. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置参数的缺省值 D. 成员函数可以是静态的 5. 对 C++ 编译器区分重载成员函数无任何意义的信息是 ( C ) A. 参数类型 B. 参数个数 C. 返回值类型 D. 关键词 const 编程题 6. 定义一个复数类 Complex, 数据成员包括实部和虚部 成员函数包括 :1) 设置实部值,2) 设置虚部值,3) 读取 / 返回实部值,4) 读取 / 返回虚部值,5) 输出复数 在主函数中定义这个复数类的一个对象, 然后对所有成员函数进行测试, 即调用所有成员函数 7. 为上述题目的复数类增加一个友元函数 该友元函数的原型为 void print (Complex &), 用于输出一个复数对象 在主函数中自行设计程序代码以测试该函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

77 总结与思考 总结与思考 4. 下述关于成员函数特征的描述中, 错误的是 ( A ) A. 成员函数一定是内联函数 B. 成员函数可以重载 C. 成员函数可以设置参数的缺省值 D. 成员函数可以是静态的 5. 对 C++ 编译器区分重载成员函数无任何意义的信息是 ( C ) A. 参数类型 B. 参数个数 C. 返回值类型 D. 关键词 const 编程题 6. 定义一个复数类 Complex, 数据成员包括实部和虚部 成员函数包括 :1) 设置实部值,2) 设置虚部值,3) 读取 / 返回实部值,4) 读取 / 返回虚部值,5) 输出复数 在主函数中定义这个复数类的一个对象, 然后对所有成员函数进行测试, 即调用所有成员函数 7. 为上述题目的复数类增加一个友元函数 该友元函数的原型为 void print (Complex &), 用于输出一个复数对象 在主函数中自行设计程序代码以测试该函数 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

78 Acknowledgement and References 致谢 Thanks to Dr. Tao Hu 胡涛 and Prof. Dr. Xiaojun Liu 刘晓军 for their insightful discussions and helpful.ppt slides. 书目 Visual C++ 程序设计 张岳新编著 C++ 程序设计教程第 3 版 王珊珊臧冽张志航编著 高质量 C/C++ 编程指南 林锐韩永泉编著 C++ Primer 中文版第 5 版 Stanley B. Lippman, Josee Lajoie, Barbara E. Moo 著, 王刚杨巨峰译 C++ Primer Plus 中文版第 6 版 Stephen Prata 著, 张海龙袁国忠译 Professional C++ 3rd Edition Marc Gregoire 著 Effective C++ 中文版 Scott Meyers 著, 侯捷译 More Effective C++ 中文版 Scott Meyers 著, 侯捷译 网络 CSDN 社区 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

79 联系我 孙东科 QQ: WeChat: DongkeSun 办公室 : 机械楼 230 室 ( 机械楼北侧 ) 东南大学机械工程学院江苏省微纳生物医疗器械设计与制造重点实验室 Dongke Sun (Southeast University) C++ Programming and Algorithms Spring semester, / 40

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

untitled

untitled 1 7 7.1 7.2 7.3 7.4 7.5 2 7.1 VFT virtual 7.1 3 1 1. 2. public protected public 3. VFT 4. this const volatile 4 2 5. ( ) ( ) 7.1 6. no-static virtual 7.2 7. inline 7.3 5 3 8. this this 9. ( ) ( ) delete

More information

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式] 用户定义类型 User-defined Datatypes classes and structs 几何向量 (Geometry Vector) 二维平面上的向量由起点和终点构成 每个点包含两个坐标 (x, y), 因此一个向量需要四个实数表示 Start= (0.9,1.5) Start= (0.4,0.8) int main() { double xstart = 0.4; double xend

More information

程序设计语言及基础

程序设计语言及基础 Chapter 10 Classes: A Deeper Look, Part 2 http://jssec.seu.edu.cn 杨明 yangming2002@seu.edu.cn OBJECTIVES To specify const (constant) objects and const member functions. To create objects composed of other

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

Microsoft PowerPoint - 10 模板 Template.pptx

Microsoft PowerPoint - 10 模板 Template.pptx 模板 Tempalte 泛型编程的需要 Why Templates? 设想你对整数类型实现了一个排序算法 : void sort(int *is,int n); 用该函数可以对实 复数或工资单排序吗? 模板可以复用源代码 - 泛型编程. inline void Swap( int &x, int &y){ int t = x; x = y; y =t; inline void Swap(double

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 CIRCLE 1 Circle 描述 编写一个圆类 Circle, 实现半径的输入 面积的计算和输出 输入 圆的半径 (double 类型 ) 输出 圆的面积 ( 保留小数点后两位 ) 样例输入 3 样例输出 28.27 提示 圆周率的取值需要比较精确, 以保证计算结果的精度 #include

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

第3章.doc

第3章.doc 3 3 3 3.1 3 IT Trend C++ Java SAP Advantech ERPCRM C++ C++ Synopsys C++ NEC C C++PHP C++Java C++Java VIA C++ 3COM C++ SPSS C++ Sybase C++LinuxUNIX Motorola C++ IBM C++Java Oracle Java HP C++ C++ Yahoo

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

More information

幻灯片 1

幻灯片 1 第三课类和对象 ( 封装 ) 互联网新技术在线教育领航者 1 内容概述 1. 封装的概念 2. 访问控制 3. 栈类的封装 4. 构造与析构 5.myString 构造函数 6. 构造与析构的次序 7. 类文件写法 8. 对象的内存 9.this 指针初探 10. 构造函数初始值列表 11. 拷贝构造和赋值运算符重载 12. 浅拷贝 13. 深拷贝 14. 成员函数内联 15. 友元 16.const

More information

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf (%d, & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9 201 201 21 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp Compilation Error long long cin scanf Time Limit Exceeded 1: A 1 B 1 C 5 D RPG 10 E 10 F 1 G II 1 1 201 201 C 1 # include 2 int main ( void

More information

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1 C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1 1 CRECT 类 1 CRect 类 设计矩形类, 包含 长度和宽度信息 基本构造函数 基础属性的访问接口 ( 读 / 写, Read/Write, Get/Set) 计算周长和面积 ( 注 : 基本构造函数, 一个无参数的默认构造函数, 以及一个初始化数据成员的构造函数如果数据成员的初始化有多种形式, 就提供多个构造函数

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

Microsoft PowerPoint - 04-Inheritance.ppt

Microsoft PowerPoint - 04-Inheritance.ppt 继承 派生与多态性 1 本章主要内容 类的继承与派生 类成员的访问控制 简单继承与多重继承 派生类的构造 析构函数 多态性 2 1 类的继承与派生 保持已有类的特性, 并在其基础上产生新的类, 称新类继承了已有类的特征, 或称已有类派生出新类 被继承的已有类称为基类 ( 或父类 ) 派生出的新类称为派生类 派生类将自动继承基类的所有特性 ( 属性和方法 ) 派生类可以定义新的特性 ( 属性和方法 )

More information

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - string_kruse [兼容模式] Strings Strings in C not encapsulated Every C-string has type char *. Hence, a C-string references an address in memory, the first of a contiguous set of bytes that store the characters making up the string.

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

第七讲 继承与多态

第七讲  继承与多态 第 七 章 继 承 与 派 生 1 本 章 主 要 内 容 的 继 承 成 员 的 访 问 控 制 单 继 承 与 多 继 承 派 生 的 构 造 析 构 函 数 成 员 的 标 识 与 访 问 深 度 探 索 2 的 继 承 与 派 生 的 继 承 与 派 生 保 持 已 有 的 特 性 而 构 造 新 的 过 程 称 为 继 承 在 已 有 的 基 础 上 新 增 自 己 的 特 性 而 产 生

More information

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf (%d, & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf (%d %d 2013 18 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp, Compilation Error cin scanf Time Limit Exceeded 1: A 5 B 5 C 5 D 5 E 5 F 5 1 2013 C 1 # include 2 int main ( void ) 3 { 4 int cases, a, b,

More information

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 PERSON 1 Person 题目描述 编写程序, 定义一个基类 Person, 包含 name 和 age 两个数据成员 ; 再由它派生出学生类 Student 和教师类 Teacher, 其中学生类添加学号 no 数据, 教师类添加职称 title 数据 ; 要求每个类均有构造函数 析构函数和显示数据的函数

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

02

02 Thinking in C++: Volume One: Introduction to Standard C++, Second Edition & Volume Two: Practical Programming C++ C C++ C++ 3 3 C C class C++ C++ C++ C++ string vector 2.1 interpreter compiler 2.1.1 BASIC

More information

第五讲 C++程序的结构

第五讲 C++程序的结构 第五章数据的共享与保护 本章主要内容 作用域与可见性 对象的生存期 数据与函数 静态成员 共享数据的保护 友元 编译预处理命令 多文件结构和工程 深度探索 2 命名空间作用域作用域与可见性标识符的作用域 标识符在程序正文中有效的区域 函数原型作用域 局部作用域 类作用域 3 作用域与可见性函数原型的作用域 函数原型中的参数, 其作用域始于 "(", 结束于 ")" 例如, 设有下列原型声明 : double

More information

extend

extend (object oriented) Encapsulation Inheritance Polymorphism Dynamic Binding (base class) (derived class) 1 class Base { int I; void X(); void Y(); class Derived: public Base { private: int j; void z(); Derived

More information

Chapter12 Derived Classes

Chapter12   Derived Classes 继 承 -- 派 生 类 复 习 1. 有 下 面 类 的 说 明, 有 错 误 的 语 句 是 : class X { A) const int a; B) X(); C) X(int val) {a=2 D) ~X(); 答 案 :C 不 正 确, 应 改 成 X(int val) : a(2) { 2. 下 列 静 态 数 据 成 员 的 特 性 中, 错 误 的 是 A) 说 明 静 态 数

More information

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 复习 创建对象 构造函数 函数重载 : 函数 = 函数名 + 参数列表 public class MyType { int i; double d; char c; void set(double x)

More information

Microsoft PowerPoint - 第06讲_继承.ppt [兼容模式]

Microsoft PowerPoint - 第06讲_继承.ppt [兼容模式] 程序设计实习 (I): C++ 程序设计 第六讲继承 上节内容回顾 三种运算符重载的实现方式 重载为普通函数 重载为成员函数 重载为友元 常见的运算符重载 流运算符 (>>

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D>

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D> 程序设计实习 (I): C++ 程序设计 第二讲类和对象 (1) 面向对象的程序设计 面向对象的程序设计方法, 能够较好解决结构化程序设计中出现的问题 面向对象的程序 = 类 + 类 + + 类 设计程序的过程, 就是设计类的过程 2 面向对象的程序设计 面向对象的程序设计方法 : 将某类客观事物共同特点 ( 属性 ) 归纳出来, 形成一个数据结 构 ( 可以用多个变量描述事物的属性 ); 将这类事物所能进行的行为也归纳出来,

More information

Microsoft PowerPoint - L17_Inheritance_v4.pptx

Microsoft PowerPoint - L17_Inheritance_v4.pptx C++ Programming Lecture 17 Wei Liu ( 刘 威 ) Dept. of Electronics and Information Eng. Huazhong University of Science and Technology May. 2015 Lecture 17 Chapter 20. Object-Oriented Programming: Inheritance

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

相 应 功 能 (5) 再 将 Boy 类 作 为 Girl 类 的 友 元 类, 在 Boy 类 的 某 成 员 函 数 VisitGirl(Girl & ) 中 访 问 Girl 类 的 私 有 成 员, 观 察 编 译 器 给 出 的 信 息 ( 6 ) 删 除 两 个 类 中 的 函 数 V

相 应 功 能 (5) 再 将 Boy 类 作 为 Girl 类 的 友 元 类, 在 Boy 类 的 某 成 员 函 数 VisitGirl(Girl & ) 中 访 问 Girl 类 的 私 有 成 员, 观 察 编 译 器 给 出 的 信 息 ( 6 ) 删 除 两 个 类 中 的 函 数 V 面 向 对 象 程 序 设 计 及 C++ 课 程 实 验 教 学 大 纲 课 程 编 号 : B030001S 课 程 名 称 : 面 向 对 象 程 序 设 计 及 C++ 课 内 总 学 时 : 3 上 机 实 验 学 时 : 8 一 实 验 课 程 的 性 质 目 的 和 任 务 性 质 : 本 实 验 课 程 是 本 科 理 工 科 各 专 业 学 生 的 通 识 基 础 课, 该 实 验

More information

提纲 1 联编与多态性 2 用虚函数实现多态 3 虚函数的工作原理 4 纯虚函数与抽象类 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

提纲 1 联编与多态性 2 用虚函数实现多态 3 虚函数的工作原理 4 纯虚函数与抽象类 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36 程序设计与算法语言 虚函数 C/C++ Programming and Algorithms Virtual Function Dongke Sun ( 孙东科 ) dksun@seu.edu.cn 东南大学机械工程学院 School of Mechanical Engineering Southeast University April 12, 2018 提纲 1 联编与多态性 2 用虚函数实现多态

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

Strings

Strings Inheritance Cheng-Chin Chiang Relationships among Classes A 類 別 使 用 B 類 別 學 生 使 用 手 機 傳 遞 訊 息 公 司 使 用 金 庫 儲 存 重 要 文 件 人 類 使 用 交 通 工 具 旅 行 A 類 別 中 有 B 類 別 汽 車 有 輪 子 三 角 形 有 三 個 頂 點 電 腦 內 有 中 央 處 理 單 元 A

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1 C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1 1 圆 1 圆 设计圆类 包含 包含基本属性和基本属性访问接口 计算面积和周长接口 2 1 圆 1 #include 2 using namespace std ; 3 c l a s s CCircle 4 { 5 p r i v a t e : 6 double r ; 7 const

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

幻灯片 1

幻灯片 1 信息科学技术学院 程序设计实习 郭炜微博 http://weibo.com/guoweiofpku http://blog.sina.com.cn/u/3266490431 刘家瑛微博 http://weibo.com/pkuliujiaying 1 信息科学技术学院 程序设计实习 郭炜刘家瑛 继承和派生 ( 教材 P215) 2 继承和派生的概念 继承 : 在定义一个新的类 B 时, 如果该类与某个已有的类

More information

程序设计与算法语言 拷贝构造 C/C++ Programming and Algorithms Copy Constructor Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineering South

程序设计与算法语言 拷贝构造 C/C++ Programming and Algorithms Copy Constructor Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineering South 程序设计与算法语言 拷贝构造 C/C++ Programming and Algorithms Copy Constructor Dongke Sun ( 孙东科 ) dksun@seu.edu.cn 东南大学机械工程学院 School of Mechanical Engineering Southeast University Spring semester, 2019 视 C++ 为一个语言联邦

More information

untitled

untitled (encapsulation) 例 類 說 類 料 來 料 information hiding 念 (inheritance) 來說 類 類 類 類 類 類 行 利 來 (polymorphism) 不 類 數 不 1 2 3 4 類 類 不 類 不 類 5 6 7 // virtual 不見了 #include #include using namespace

More information

模板

模板 制作人 : 张刚 目录 类和对象 面向对象程序设计基本特征 类的声明 构造方法 成员变量和方法 封装 继承 多态 包 访问控制 final static 抽象类和接口 内部类 沈阳工业大学软件学院 Java 课程教研组 Page 2 核心知识点 类 对象 三个基本特征 类的基本结构 成员变量 构造方法 成员方法 类实例 对象创建和操作 沈阳工业大学软件学院 Java 课程教研组 Page 3 1.

More information

C++ 程序设计 实验 1 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 实验 1 - 参考答案 MASTER 2017 年 5 月 21 日 1 C++ 程序设计 实验 1 - 参考答案 MASTER 2017 年 5 月 21 日 1 1 简单图形 1 简单图形 输入图形的行数 ( 如下图 7 行 ), 输出如下图所示图形 * *** ***** ******* ***** *** * 2 1 简单图形 1 #inc lude 2 using namespace std ; 3 4 // 注意变量命名的方式 5 //

More information

Microsoft Word - 物件導向編程精要.doc

Microsoft Word - 物件導向編程精要.doc Essential Object-Oriented Programming Josh Ko 2007.03.11 object-oriented programming C++ Java OO class object OOP Ruby duck typing complexity abstraction paradigm objects objects model object-oriented

More information

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity 1 C++ 1 C++ Primer C++ (giantchen@gmail.com) 2012-7-11 Creative Commons - - 3.0 Unported (cc by-nc-nd) http://creativecommons.org/licenses/by-nc-nd/3.0/ 1 C++ 2009 Stanley Lippman C++ C++ Java/C#/Python

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点 复习 Protected 可以被子类 / 同一包中的类访问, 不能被其他类访问 弱化的 private 同时赋予 package access class MyType { public int i; public double d; public

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

提问袁小兵:

提问袁小兵: C++ 面 试 试 题 汇 总 柯 贤 富 管 理 软 件 需 求 分 析 篇 1. STL 类 模 板 标 准 库 中 容 器 和 算 法 这 部 分 一 般 称 为 标 准 模 板 库 2. 为 什 么 定 义 虚 的 析 构 函 数? 避 免 内 存 问 题, 当 你 可 能 通 过 基 类 指 针 删 除 派 生 类 对 象 时 必 须 保 证 基 类 析 构 函 数 为 虚 函 数 3.

More information

Microsoft Word - chap10.doc

Microsoft Word - chap10.doc 78 10. Inheritance in C++ 我 們 已 介 紹 了 物 件 導 向 程 式 的 第 一 個 主 要 特 性, 即 程 式 可 模 組 化 成 為 類 別 ( 物 件 ), 類 別 具 有 資 料 封 裝 的 特 性 接 下 來 我 們 要 介 紹 物 件 導 向 程 式 的 另 一 個 主 要 特 性, 那 就 是 類 別 具 有 繼 承 的 功 能 繼 承 就 是 重 複

More information

untitled

untitled 1 1.1 1.2 1.3 1.4 1.5 ++ 1.6 ++ 2 BNF 3 4 5 6 7 8 1.2 9 1.2 IF ELSE 10 1.2 11 1.2 12 1.3 Ada, Modula-2 Simula Smalltalk-80 C++, Objected Pascal(Delphi), Java, C#, VB.NET C++: C OOPL Java: C++ OOPL C# C++

More information

untitled

untitled 1 Outline 類别 欄 (1) 類 類 狀 更 易 類 理 若 類 利 來 利 using 來 namespace 類 ; (2) namespace IBM class Notebook namespace Compaq class Notebook 類别 類 來 類 列 欄 (field) (property) (method) (event) 類 例 立 來 車 類 類 立 車 欄 料

More information

Microsoft Word - 970617cppFinalSolution.doc

Microsoft Word - 970617cppFinalSolution.doc 國 立 台 灣 海 洋 大 學 資 訊 工 程 系 C++ 程 式 設 計 期 末 考 參 考 答 案 姓 名 : 系 級 : 學 號 : 97/06/17 考 試 時 間 :10:00 12:10 試 題 敘 述 蠻 多 的, 看 清 楚 題 目 問 什 麼, 針 對 重 點 回 答 是 很 重 要 的 ; 不 確 定 的 請 一 定 要 當 場 提 出 來, 不 要 白 花 力 氣 在 誤 會

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B,

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B, 1 下列类头定义中, 正确的是 A class x B public x extends y C public class x extends y. D class x extends y implements y1 2 现有两个类 A B, 以下描述中表示 B 继承自 A 的是 (D ) A) class A extends B B) class B implements A C) class A

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

Strings

Strings Polymorphism and Virtual Functions Cheng-Chin Chiang Virtual Function Basics 多 型 (Polymorphism) 賦 予 一 個 函 數 多 種 意 涵, 存 在 於 同 一 類 別 之 內 祖 先 類 別 與 後 代 類 別 間 物 件 導 向 程 式 設 計 基 本 原 理 虛 擬 函 數 (Virtual Function)

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

IO

IO 1 C/C++ C FILE* fscanf fgets fread fprintf fputs fwrite C++ ifstream ofstream >>

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 Protected 可以被子类 / 同一包中的类访问, 不能被其他类访问 弱化的 private 同时赋予 package access class MyType { public int i; public double d; public char

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 Protected 可以被子类 / 同一包中的类访问, 不能被其他类访问 弱化的 private 同时赋予 package access class MyType { public int i; public double d; public char

More information

上海交通大学

上海交通大学 一 读程序, 写结果 ( 每题 4 分, 共 40 分 ) 1. 写出下列程序运行结果 class test friend test operator+(const test &p1, const test &p2) return test(p1.data1 + p2.data1, p1.data2 + p2.data2); friend ostream &operator

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

幻灯片 1

幻灯片 1 第四课类和对象 ( 构造深入 ) 互联网新技术在线教育领航者 1 内容概述 1. 数据成员指针 2. 成员函数指针 3. 三 / 五法则 4. 引用计数 5. 写时拷贝 6.swap 函数 7. 移动构造函数 8. 移动赋值运算符重载 9. 对象移动 10.std::vector 动态增长 11.std::vector 与移动 12. 移动小结 互联网新技术在线教育领航者 2 数据成员指针 定义 :

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class - Table.class

More information

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 C C trio@seu.edu.cn C C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 Week3 C Week5 Week5 Memory & Pointer

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

北京大学

北京大学 1 string 类 郭炜刘家瑛 北京大学程序设计实习 string 类 string 类是一个模板类, 它的定义如下 : typedef basic_string string; 使用 string 类要包含头文件 string 对象的初始化 : string s1("hello"); // 一个参数的构造函数 string s2(8, x ); // 两个参数的构造函数

More information

Eclipse C C++, or

Eclipse C C++,  or Eclipse C C++, Emailctchen@pl.csie.ntut.edu.tw or s1669021@ntut.edu.tw, s2598003@ntut.edu.tw http://pl.csie.ntut.edu.tw/~ctchen, http://www.ntut.edu.tw/~s2598003/ 2004/9/10 (0.02 ) Eclipse http://www.eclipse.org

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 类和对象 Ⅱ 常见考点 常对象的使用方法 常数据成员和常成员函数的使用方法 mutable 数据成员的特点 构造函数中初始化列表的使用方法 explicit 关键字的作用 子对象的使用方法 使用类前向引用声明的情况 子对象构造函数的设计和执行次序 静态子对象的特点 嵌套类和局部类的设计方法与作用 3.1 常对象和常对象成员 3.1.1 要点归纳 1. 常对象常对象是指对象常量, 其一般定义格式如下

More information

Microsoft Word - 第7章 类与对象.docx

Microsoft Word - 第7章 类与对象.docx 第 7 章类与对象 案例 1 地址类 #include class Address char Name[21]; char Street[51]; char City[51]; char Postcode[10]; SetAddress(char *name,char *street,char *city,char *postcode); void ChangeName(char

More information

目录 C++ 基本的程序设计... 1 C++ 对 C 的扩充... 3 类和对象... 5 继承和派生... 9 多态性 函数模板和类模板 输入输出流

目录 C++ 基本的程序设计... 1 C++ 对 C 的扩充... 3 类和对象... 5 继承和派生... 9 多态性 函数模板和类模板 输入输出流 面向对象程序设计 上机实验指导书 临沂大学汽车学院 编写 : 韩晓翠 2015 年 8 月修订 1 目录 C++ 基本的程序设计... 1 C++ 对 C 的扩充... 3 类和对象... 5 继承和派生... 9 多态性... 11 函数模板和类模板... 13 输入输出流... 14 2 C++ 基本的程序设计 一 目的 : 1 熟悉 VC++ 环境的基本命令和功能键 ; 2 掌握 C++ 程序的三大基本结构的输入

More information

Modeling & Simulation 数学原理 物理规律和程序设计的综合 Magic Fluids Heart Simulator Dongke Sun (Southeast University) C++ Programming and Algorithms April 23,

Modeling & Simulation 数学原理 物理规律和程序设计的综合 Magic Fluids Heart Simulator Dongke Sun (Southeast University) C++ Programming and Algorithms April 23, 程序设计与算法语言 继承与派生 C/C++ Programming and Algorithms Inheritance and Derivation Dongke Sun ( 孙东科 ) dksun@seu.edu.cn 东南大学机械工程学院 School of Mechanical Engineering Southeast University April 23, 2018 Modeling

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

Microsoft Word - ch04三校.doc

Microsoft Word - ch04三校.doc 4-1 4-1-1 (Object) (State) (Behavior) ( ) ( ) ( method) ( properties) ( functions) 4-2 4-1-2 (Message) ( ) ( ) ( ) A B A ( ) ( ) ( YourCar) ( changegear) ( lowergear) 4-1-3 (Class) (Blueprint) 4-3 changegear

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

Microsoft Word - 全文.doc

Microsoft Word - 全文.doc 在 鲜 于 璜 碑 全 国 书 法 名 家 作 品 邀 请 展 开 幕 式 上 的 致 辞 张 勇 尊 敬 的 各 位 领 导 各 位 嘉 宾 书 法 界 的 朋 友 们 : 大 家 上 午 好! 天 高 气 爽, 秋 月 墨 香 今 天, 鲜 于 璜 碑 全 国 书 法 名 家 作 品 邀 请 展 开 幕 式 在 武 清 隆 重 举 行, 这 是 书 法 界 的 一 大 盛 事, 也 是 武 清

More information

Ps22Pdf

Ps22Pdf : : : / : ISBN 7-5617 - 2033-8 / K 116 : 5. 00 : 2005 7 1 CIP ( 2005) 109076 , 123, 1976 10 6, 10 9 1015,,,,, : ; 2 3,, 3 10 15 17 1 16 1, 4,, 17 18,,,, 23, 3, 7 19 3 4 6 4. 5 20, 23, 24 1900, 3000 770.,

More information

Guava学习之CharSequenceReader

Guava学习之CharSequenceReader CharSequenceReader 类是以 CharSequence 的形式读取字符 CharSequenceReader 类继承自 Reader 类, 除了 remaining() hasremaining() 以及 checkopen() 函数之后, 其他的函数都是重写 Reader 类中的函数 CharSequenceReader 类声明没有用 public 关键字, 所以我们暂时还不能调用这个类

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 1 CARDGAME 1 CardGame 题目描述 桌上有一叠牌, 从第一张牌 ( 即位于顶面的牌 ) 开始从上往下依次编号为 1~n 当至少还剩两张牌时进行以下操作 : 把第一张牌扔掉, 然后把新的第一张放到整叠牌的最后 请模拟这个过程, 依次输出每次扔掉的牌以及最后剩下的牌的编号 输入 输入正整数 n(n

More information

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检 2016 年 上 半 年 软 件 设 计 师 考 试 真 题 ( 下 午 题 ) 下 午 试 题 试 题 一 ( 共 15 分 ) 阅 读 下 列 说 明 和 图, 回 答 问 题 1 至 问 题 4, 将 解 答 填 入 答 题 纸 的 对 应 栏 内 说 明 某 会 议 中 心 提 供 举 办 会 议 的 场 地 设 施 和 各 种 设 备, 供 公 司 与 各 类 组 织 机 构 租 用 场

More information

4. if 与 else 在使用过程中为避免嵌套出现二义性,C++ 中规定与 else 子句配对的是 ( ) A. 其之前最近的 if 语句 B. 其之前最近且尚未配对的 if 语句 C. 缩排位置相同的 if 语句 D. 其之后最近的 if 语句答案 :B 解析 :C++ 中规定与 else 子句

4. if 与 else 在使用过程中为避免嵌套出现二义性,C++ 中规定与 else 子句配对的是 ( ) A. 其之前最近的 if 语句 B. 其之前最近且尚未配对的 if 语句 C. 缩排位置相同的 if 语句 D. 其之后最近的 if 语句答案 :B 解析 :C++ 中规定与 else 子句 计算机 -C++ 程序设计 ( 本科 ) 2017 年 10 月真题及答案解析 单项选择题 : 本大题共 20 小题 每小题 1 分, 共 20 分 1. 按照标识符的要求, 不能组成标识符的符号是 ( ) A. 连接符 B. 下划线 C. 大小写字母 D. 数字字符答案 :A 解析 : 组成标识符的符号可以是大小写字母 下划线和数字, 且数字不能打头 2. 下列输出语句中, 正确的是 ( ) A.

More information

C++ 程序设计 OJ10 - 参考答案 MASTER 2019 年 6 月 17 日 1

C++ 程序设计 OJ10 - 参考答案 MASTER 2019 年 6 月 17 日 1 C++ 程序设计 OJ10 - 参考答案 MASTER 2019 年 6 月 17 日 1 1 STRINGREVERSE 1 StringReverse 题目描述 利用 string 类对字符串进行 ( 按反转后字典序 ) 排序并输出, 例如两个字符串为 aab, cba, 则 cba 应该排在 aab 之前, 因为 cba 反转后为 abc, aab 反转后为 baa. 输入 第一行为一个整数

More information

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F 1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET 2.0 2.0.NET Framework.NET Framework 2.0 ( 3).NET Framework 2.0.NET Framework ( System ) o o o o o o Boxing UnBoxing() o

More information

슬라이드 1

슬라이드 1 2018-2019 年度第二学期 00106501 计算机图形学 童伟华管理科研楼 1205 室 E-mail: tongwh@ustc.edu.cn 中国科学技术大学数学科学学院 http://math.ustc.edu.cn/ 附讲三 C/C++ 编程 ( 二 ) 2 C++ 特点 C++ 是面对对象 (object oriented) 编程语言 纯面向对象语言 : 指不管什么东西, 都应该存在于对象之中,

More information

Microsoft PowerPoint - CPP-Ch Print.ppt [兼容模式]

Microsoft PowerPoint - CPP-Ch Print.ppt [兼容模式] Chapter 13 Object-Oriented Programming: Polymorphism http://jssec.seu.edu.cn 杨明 yangming2002@seu.edu.cn OBJECTIVES What polymorphism( 多态 ) is, how it makes programming more convenient, and how it makes

More information

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 MYQUEUE 1 MyQueue 题目描述 设计一个 MyQueue 类模板, 类模板说明如下 : template class MyQueue; template std::ostream & operator

More information