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

Size: px
Start display at page:

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

Transcription

1 程序设计与算法语言 虚函数 C/C++ Programming and Algorithms Virtual Function Dongke Sun ( 孙东科 ) dksun@seu.edu.cn 东南大学机械工程学院 School of Mechanical Engineering Southeast University April 12, 2018

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

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

4 联编与多态性静态联编和动态联编 联编 Binding 是指一个计算机程序彼此关联的过程 在这里指函数间调用关系的确定 按照联编所确定的时刻不同, 可分为两种 : 静态联编和动态联编 静态联编 Static Binding, Compile-Time Binding 是指联编出现在编译连接阶段, 即函数调用关系的确定是在程序执行之前 这种联编又称早期联编, 通过这种联编可实现静态多态 动态联编 Late Binding, Runtime Binding, 运行阶段才能确定函数的调用关系, 这就是动态联编 动态联编又称滞后联编 晚期联编 动态联编技术能实现动态多态 必须将类的成员函数定义成虚函数 (virtual function), 才可以实现动态联编 多态性 Polymorphism 意味着具有多种形态 它起源于 poly 和 morph, 前者表示多, 后者表示形态 多态性是将接口与实现分离, 实现相同的方法但因数据差异而采用不同的策略 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

5 联编与多态性普通函数的静态联编 静态联编在编译连接阶段, 就能根据参数的个数和类型确定调用的是哪一个函数 1 #include <iostream> 2 using namespace std; 3 int add(int a, int b) // 重载函数 1 4 { 5 return(a+b); 6 } 7 double add(double a, double b) // 重载函数 2 8 { 9 return(a+b); 10 } 11 int main( ) 12 { 13 cout<<add(1, 2)<< \t ; // 编译时确定调用重载函数 1 14 cout<<add(1.3, 2.5)<< \n ; // 编译时确定调用重载函数 2 15 return 0; 16 } 程序输出结果 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

6 联编与多态性普通函数的静态联编 静态联编在编译连接阶段, 就能根据参数的个数和类型确定调用的是哪一个函数 1 #include <iostream> 2 using namespace std; 3 int add(int a, int b) // 重载函数 1 4 { 5 return(a+b); 6 } 7 double add(double a, double b) // 重载函数 2 8 { 9 return(a+b); 10 } 11 int main( ) 12 { 13 cout<<add(1, 2)<< \t ; // 编译时确定调用重载函数 1 14 cout<<add(1.3, 2.5)<< \n ; // 编译时确定调用重载函数 2 15 return 0; 16 } 程序输出结果 :3 3.8 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

7 联编与多态性成员函数的静态联编 1 class Point 2 { 3 protected: 4 double x, y; // 点的坐标值 5 public: 6 Point(double a=0, double b=0) 7 { x=a; y=b; } 8 double Area( ) // 函数 1 9 { return 0.0; } 10 }; 11 class Rectangle : public Point 12 { 13 protected: 14 double x1, y1; // 长方形右下角点的坐标值, 基类中的 x, y 为左上角坐标点 15 public: 16 Rectangle(double a=0, double b=0, double c=0, double d=0):point(a, b) 17 { x1=c; y1=d; } 18 double Area( ) // 函数 2 19 { return (x-x1)*(y-y1); } 20 }; 21 class Circle: public Point 22 { Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

8 联编与多态性成员函数的静态联编 23 protected: 24 double r; // 半径, 基类中 x, y 为圆心坐标点 25 public: 26 Circle(double a=0, double b=0, double c=0):point(a, b) 27 { r=c; } 28 double Area( ) // 函数 3 29 { return 3.14*r*r; } 30 }; 31 double CalcArea(Point &p) // 普通函数, 编译连接时一定是调用函数 1 32 { return( p.area( ) ); } 33 int main( ) 34 { 35 Rectangle r(0, 0, 1, 1); Circle c(0, 0, 1); 36 // 用派生类实参初始化基类形参,p 只能引用基类的成员 37 cout<<calcarea(r)<< \t ; // 参数传递 :Point &p=r 38 cout<<calcarea(c)<< \n ; // 参数传递 :Point &p=c 39 return 0; 40 } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

9 联编与多态性成员函数的静态联编 23 protected: 24 double r; // 半径, 基类中 x, y 为圆心坐标点 25 public: 26 Circle(double a=0, double b=0, double c=0):point(a, b) 27 { r=c; } 28 double Area( ) // 函数 3 29 { return 3.14*r*r; } 30 }; 31 double CalcArea(Point &p) // 普通函数, 编译连接时一定是调用函数 1 32 { return( p.area( ) ); } 33 int main( ) 34 { 35 Rectangle r(0, 0, 1, 1); Circle c(0, 0, 1); 36 // 用派生类实参初始化基类形参,p 只能引用基类的成员 37 cout<<calcarea(r)<< \t ; // 参数传递 :Point &p=r 38 cout<<calcarea(c)<< \n ; // 参数传递 :Point &p=c 39 return 0; 40 } 程序输出结果 :0 0 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

10 联编与多态性成员函数的静态联编 23 protected: 24 double r; // 半径, 基类中 x, y 为圆心坐标点 25 public: 26 Circle(double a=0, double b=0, double c=0):point(a, b) 27 { r=c; } 28 double Area( ) // 函数 3 29 { return 3.14*r*r; } 30 }; 31 double CalcArea(Point &p) // 普通函数, 编译连接时一定是调用函数 1 32 { return( p.area( ) ); } 33 int main( ) 34 { 35 Rectangle r(0, 0, 1, 1); Circle c(0, 0, 1); 36 // 用派生类实参初始化基类形参,p 只能引用基类的成员 37 cout<<calcarea(r)<< \t ; // 参数传递 :Point &p=r 38 cout<<calcarea(c)<< \n ; // 参数传递 :Point &p=c 39 return 0; 40 } 程序输出结果 :0 0 能否寻找或设计一种机制, 让 CalcArea( ) 函数变成一个通用的求面积的函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

11 联编与多态性成员函数的静态联编 23 protected: 24 double r; // 半径, 基类中 x, y 为圆心坐标点 25 public: 26 Circle(double a=0, double b=0, double c=0):point(a, b) 27 { r=c; } 28 double Area( ) // 函数 3 29 { return 3.14*r*r; } 30 }; 31 double CalcArea(Point &p) // 普通函数, 编译连接时一定是调用函数 1 32 { return( p.area( ) ); } 33 int main( ) 34 { 35 Rectangle r(0, 0, 1, 1); Circle c(0, 0, 1); 36 // 用派生类实参初始化基类形参,p 只能引用基类的成员 37 cout<<calcarea(r)<< \t ; // 参数传递 :Point &p=r 38 cout<<calcarea(c)<< \n ; // 参数传递 :Point &p=c 39 return 0; 40 } 程序输出结果 :0 0 能否寻找或设计一种机制, 让 CalcArea( ) 函数变成一个通用的求面积的函数 这就是 C++ 提供的虚函数和动态联编所应该完成的工作 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

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

13 用虚函数实现多态使用虚函数实现多态 虚函数在类中, 那些被 virtual 关键字修饰的成员函数, 就是虚函数 1 virtual <type> <function_name> ( [<arguments>] ) 2 {...} 虚函数的作用就是实现多态性, 即根据不同的类对象调用其相应的函数 动态联编示例将成员函数定义成虚函数, 以实现动态联编 1 #include <iostream> 2 using namespace std; 3 class Point 4 { 5 protected: 6 double x, y; // 点的坐标值 7 public: 8 Point(double a=0, double b=0) 9 { x=a; y=b; } 10 virtual double Area( ) // 虚函数 1 11 { return 0.0; } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

14 用虚函数实现多态使用虚函数实现多态 12 }; 13 class Rectangle : public Point 14 { 15 protected: 16 double x1, y1; // 长方形右下角点的坐标值, 基类中 x, y 为左上角坐标点 17 public: 18 Rectangle(double a=0, double b=0, double c=0, double d=0):point(a,b) 19 { x1=c; y1=d; } 20 virtual double Area( ) // 虚函数 2 21 { return (x-x1)*(y-y1); } 22 }; 23 class Circle:public Point 24 { 25 protected: 26 double r; // 半径, 基类中 x, y 为圆心坐标点 27 public: 28 Circle(double a=0, double b=0, double c=0):point(a, b) 29 { r=c; } 30 virtual double Area( ) // 虚函数 3 31 { return 3.14*r*r; } 32 }; 33 double CalcArea(Point &p) // 基类对象引用派生类对象 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

15 用虚函数实现多态使用虚函数实现多态 34 { 35 return(p.area( )); // A 36 } 37 int main() 38 { 39 Point p(1, 2); 40 Rectangle r(0, 0, 1, 1); 41 Circle c(0, 0, 1); 42 // 用派生类的对象实例化基类对象的引用, 用虚函数实现动态多态 43 cout<<calcarea(p)<< \t // B 参数传递 :Point &p=p 44 <<CalcArea(r)<< \t // C 参数传递 :Point &p=r 45 <<CalcArea(c)<< \n ; // D 参数传递 :Point &p=c 46 return 0; 47 } 在 A 处, 基类的对象调用派生类虚函数,Area( ) 是虚函数, 可认为是三个虚函数 ( 函数 1 函数 2 函数 3) 的入口 在程序的运行阶段, 根据实参的类型来确定调用哪一个虚函数 例如, 程序运行到在 B C D 处可根据函数 CalcArea(Point &p) 中实参的不同而调用相应的函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

16 用虚函数实现多态使用虚函数实现多态 有关虚函数的说明 派生类的虚函数与基类的虚函数必须同名, 且参数的类型 个数 顺序必须一致 如果仅仅名称相同, 就会变成函数 覆盖 ( 重写,override), 触发隐藏机制 关于重载 覆盖 隐藏这三者之间的区别, 我们暂不介绍 稍后深入讨论 基类中虚函数前的关键字 virtual 不能缺省 必须通过基类对象的指针或引用调用虚函数, 才能实现动态多态 内联函数不能定义为虚函数 这是因为 : 内联函数是个静态行为, 而虚函数是个动态行为 这两者矛盾, 不可同时出现 即使将虚函数申请为内联函数, 编译器肯定不允许虚函数内联 静态成员函数不能定义为虚函数 这是因为 : 静态成员函数属于类, 与具体对象无关 友元函数不能定义为虚函数 这是因为 : 友元函数不是类的成员函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

17 用虚函数实现多态使用虚函数实现多态 不能将构造函数定义为虚函数, 但可将析构函数定义为虚函数 在构造函数中调用虚函数, 不遵循动态多态规则, 即 : 这种情况下调用的是类自身的虚函数 虚函数与一般函数相比, 程序调用时的执行速度要慢一些 这是因为 : 为了实现动态联编, 编译器为每个含有虚函数的对象增加指向虚函数地址表的指针, 通过该指针实现对虚函数的间接调用 以上涉及虚函数的工作原理, 我们对此暂不深究 稍后介绍 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

18 用虚函数实现多态在成员函数中调用虚函数 在成员函数中调用成员函数时, 系统都是通过对象自身的指针 this 调用的 1 class A 2 { 3 public: 4 virtual void fun1( ) { cout << "A::fun1" << \t ; fun2( ); } // 虚函数 5 void fun2( ) { cout << "A::fun2" << \t ; fun3( ); } //E 6 7 virtual void fun3( ) { cout << "A::fun3" << \t ; fun4( ); } // 虚函数 8 void fun4( ) { cout << "A::fun4" << \n ; } 9 }; 10 class B: public A 11 { 12 public: 13 void fun3( ) { cout << "B::fun3" << \t ; fun4( ); } 14 void fun4( ) { cout << "B::fun4" << \n ; } 15 }; 16 int main( ) 17 { 18 A a; a.fun1( ); 19 B b; b.fun1( ); 20 return 0; 21 } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

19 用虚函数实现多态在成员函数中调用虚函数 程序 (Polymorphism3.cpp) 的运行结果是 : A::fun1 A::fun2 A::fun3 A::fun4 A::fun1 A::fun2 B::fun3 B::fun4 在成员函数中调用成员函数时, 系统都是通过对象自身的指针 this 调用的 例如, 类 A 中的 fun2( ) 的实际被处理成如下形式 : 5 void fun2( ) 6 { 7 cout << "A::fun2" << \t ; 8 this->fun3( ); //E 9 } 在 E 行, this 是指向 b 的指针, 所以调用 B 的 fun3( ) 函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

20 用虚函数实现多态在构造函数中调用虚函数 构造函数调用虚函数, 调用的是类本身的虚函数 ; 成员函数调用虚函数, 遵循动态多态性原则 1 class A 2 { 3 public: 4 A( ) 5 { fun( ); } 6 virtual void fun( ) 7 { cout<<"a::fun"<< \t ; } 8 }; 9 class B: public A 10 { 11 public: 12 B( ) 13 { fun( ); } 14 void fun( ) 15 { cout<<"b::fun"<< \t ; } 16 void g( ) 17 { fun( );} // 调用虚函数 运行结果 : 19 }; 20 class C: public B 21 { 22 public: 23 C( ) 24 { fun( ); } 25 void fun( ) 26 { cout<<"c::fun"<<endl; } 27 }; 28 int main( ) 29 { 30 // 依次调用 A B C 三类的缺省 构造函数 31 C c; 32 c.g( ); 33 return 0; 34 } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

21 用虚函数实现多态在构造函数中调用虚函数 构造函数调用虚函数, 调用的是类本身的虚函数 ; 成员函数调用虚函数, 遵循动态多态性原则 1 class A 2 { 3 public: 4 A( ) 5 { fun( ); } 6 virtual void fun( ) 7 { cout<<"a::fun"<< \t ; } 8 }; 9 class B: public A 10 { 11 public: 12 B( ) 13 { fun( ); } 14 void fun( ) 15 { cout<<"b::fun"<< \t ; } 16 void g( ) 17 { fun( );} // 调用虚函数 运行结果 :A::fun B::fun C::fun C::fun 19 }; 20 class C: public B 21 { 22 public: 23 C( ) 24 { fun( ); } 25 void fun( ) 26 { cout<<"c::fun"<<endl; } 27 }; 28 int main( ) 29 { 30 // 依次调用 A B C 三类的缺省 构造函数 31 C c; 32 c.g( ); 33 return 0; 34 } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

22 定义虚析构函数 用虚函数实现多态 虚析构函数如果类的构造函数中有动态申请的存储空间, 在析构函数中应释放该空间 此时, 建议将析构函数定义为虚函数, 以便实现通过基类的指针或引用撤消派生类对象时的多态性 析构函数 不是虚函数 的情况 1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 char *Aptr; 6 public: 7 A( ) 8 { Aptr = new char[100]; } 9 ~A( ) // 析构函数不是虚函数 10 { 11 delete [ ]Aptr; 12 cout<<"delete [ ]Aptr"<< endl; 13 } 14 }; 15 class B : public A 16 { 17 char *Bptr; 18 public: 19 B( ) 20 { Bptr=new char[100]; } 21 ~B( ) 22 { 23 delete [ ]Bptr; 24 cout<<"delete [ ]Bptr"<< endl; 25 } 26 }; Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

23 虚析构函数 用虚函数实现多态 27 int main( ) 28 { 29 B b; 30 return 0; 31 } 系统自动撤销派生类对象, 不需要将析构函数定义为虚函数 输出结果 : 27 int main() 28 { 29 A *p1=new B; // 基类的指针 30 delete p1; 31 A &p2=*(new B); // 基类的引用 32 delete &p2; 33 return 0; 34 } 输出结果 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

24 虚析构函数 用虚函数实现多态 27 int main( ) 28 { 29 B b; 30 return 0; 31 } 系统自动撤销派生类对象, 不需要将析构函数定义为虚函数 输出结果 : Delete [ ]Bptr Delete [ ]Aptr 27 int main() 28 { 29 A *p1=new B; // 基类的指针 30 delete p1; 31 A &p2=*(new B); // 基类的引用 32 delete &p2; 33 return 0; 34 } 输出结果 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

25 虚析构函数 用虚函数实现多态 27 int main( ) 28 { 29 B b; 30 return 0; 31 } 系统自动撤销派生类对象, 不需要将析构函数定义为虚函数 输出结果 : Delete [ ]Bptr Delete [ ]Aptr 27 int main() 28 { 29 A *p1=new B; // 基类的指针 30 delete p1; 31 A &p2=*(new B); // 基类的引用 32 delete &p2; 33 return 0; 34 } 输出结果 : Delete [ ]Aptr Delete [ ]Aptr 如果将析构函数定义成虚析构函数, 则运行结果为 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

26 虚析构函数 用虚函数实现多态 27 int main( ) 28 { 29 B b; 30 return 0; 31 } 系统自动撤销派生类对象, 不需要将析构函数定义为虚函数 输出结果 : Delete [ ]Bptr Delete [ ]Aptr 27 int main() 28 { 29 A *p1=new B; // 基类的指针 30 delete p1; 31 A &p2=*(new B); // 基类的引用 32 delete &p2; 33 return 0; 34 } 输出结果 : Delete [ ]Aptr Delete [ ]Aptr 如果将析构函数定义成虚析构函数, 则运行结果为 : 9 virtual ~A( ) // 类 B 的析构函数自然也是虚析构函数 10 {... } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

27 虚析构函数 用虚函数实现多态 27 int main( ) 28 { 29 B b; 30 return 0; 31 } 系统自动撤销派生类对象, 不需要将析构函数定义为虚函数 输出结果 : Delete [ ]Bptr Delete [ ]Aptr 27 int main() 28 { 29 A *p1=new B; // 基类的指针 30 delete p1; 31 A &p2=*(new B); // 基类的引用 32 delete &p2; 33 return 0; 34 } 输出结果 : Delete [ ]Aptr Delete [ ]Aptr 如果将析构函数定义成虚析构函数, 则运行结果为 : 9 virtual ~A( ) // 类 B 的析构函数自然也是虚析构函数 10 {... } Delete [ ]Bptr // 派生类析构 Delete [ ]Aptr // 基类析构 Delete [ ]Bptr // 派生类析构 Delete [ ]Aptr // 基类析构 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

28 虚析构函数 用虚函数实现多态 27 int main( ) 28 { 29 B b; 30 return 0; 31 } 系统自动撤销派生类对象, 不需要将析构函数定义为虚函数 输出结果 : Delete [ ]Bptr Delete [ ]Aptr 27 int main() 28 { 29 A *p1=new B; // 基类的指针 30 delete p1; 31 A &p2=*(new B); // 基类的引用 32 delete &p2; 33 return 0; 34 } 输出结果 : Delete [ ]Aptr Delete [ ]Aptr 如果将析构函数定义成虚析构函数, 则运行结果为 : 9 virtual ~A( ) // 类 B 的析构函数自然也是虚析构函数 10 {... } Delete [ ]Bptr // 派生类析构 Delete [ ]Aptr // 基类析构 Delete [ ]Bptr // 派生类析构 Delete [ ]Aptr // 基类析构 结论 : 对于虚函数, 若用派生类的指针或对象初始化基类的指针或引用, 则通过该指针或引用调用虚函数, 遵循派生类析构函数的 逐层 调用规则 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

29 虚析构函数的作用 用虚函数实现多态 当一个类被用来作为基类的时候, 把这个类的析构函数定义成虚函数 1 class ClxBase 2 { 3 public: 4 ClxBase() {}; 5 virtual ~ClxBase() {}; 6 7 virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; }; 8 }; 9 10 class ClxDerived : public ClxBase 11 { 12 public: 13 ClxDerived() {}; 14 ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; void DoSomething() { cout << "Do something in class ClxDerived!" << endl; }; 17 }; Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

30 虚析构函数的作用 用虚函数实现多态 代码 18 ClxBase *ptest = new ClxDerived; 19 ptest->dosomething(); 20 delete ptest; 的输出结果是 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

31 虚析构函数的作用 用虚函数实现多态 代码 18 ClxBase *ptest = new ClxDerived; 19 ptest->dosomething(); 20 delete ptest; 的输出结果是 : Do something in class ClxDerived! Output from the destructor of class ClxDerived! 如果把类 ClxBase 析构函数前的 virtual 去掉, 那输出结果是 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

32 虚析构函数的作用 用虚函数实现多态 代码 18 ClxBase *ptest = new ClxDerived; 19 ptest->dosomething(); 20 delete ptest; 的输出结果是 : Do something in class ClxDerived! Output from the destructor of class ClxDerived! 如果把类 ClxBase 析构函数前的 virtual 去掉, 那输出结果是 : Do something in class ClxDerived! 把基类的析构函数定义成虚函数的原因在于 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

33 虚析构函数的作用 用虚函数实现多态 代码 18 ClxBase *ptest = new ClxDerived; 19 ptest->dosomething(); 20 delete ptest; 的输出结果是 : Do something in class ClxDerived! Output from the destructor of class ClxDerived! 如果把类 ClxBase 析构函数前的 virtual 去掉, 那输出结果是 : Do something in class ClxDerived! 把基类的析构函数定义成虚函数的原因在于 : 一般情况下类的析构函数应完成内存资源释放, 而析构函数不被调用的话就会造成内存泄漏 当用一个基类的指针删除一个派生类的对象时, 要确保派生类的析构函数会被调用, 即确保不会内存泄漏 当然, 并不是要把所有类的析构函数都写成虚函数 因为 : Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

34 虚析构函数的作用 用虚函数实现多态 代码 18 ClxBase *ptest = new ClxDerived; 19 ptest->dosomething(); 20 delete ptest; 的输出结果是 : Do something in class ClxDerived! Output from the destructor of class ClxDerived! 如果把类 ClxBase 析构函数前的 virtual 去掉, 那输出结果是 : Do something in class ClxDerived! 把基类的析构函数定义成虚函数的原因在于 : 一般情况下类的析构函数应完成内存资源释放, 而析构函数不被调用的话就会造成内存泄漏 当用一个基类的指针删除一个派生类的对象时, 要确保派生类的析构函数会被调用, 即确保不会内存泄漏 当然, 并不是要把所有类的析构函数都写成虚函数 因为 : 当类里面有虚函数的时候, 编译器会给类添加一个虚函数表用来存放虚函数指针, 这样就会增加类的存储空间 所以, 只有当一个类被用来作为基类的时候, 才把析构函数写成虚函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

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

36 虚函数的工作原理 虚函数的工作原理 再谈虚函数虚函数是 C++ 多态性的主要体现, 指向基类的指针在操作它的多态类对象时, 会根据不同的类对象, 调用其相应的函数, 这个函数就是虚函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

37 虚函数的工作原理 虚函数的工作原理 再谈虚函数虚函数是 C++ 多态性的主要体现, 指向基类的指针在操作它的多态类对象时, 会根据不同的类对象, 调用其相应的函数, 这个函数就是虚函数 虚函数工作原理在 C++ 中, 虚函数是通过虚函数表 (Virtual Table,VTABLE) 来实现的 在这个表中, 存储的是虚函数的地址表 这张表解决了继承 覆盖的问题, 保证其容真实反应实际的函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

38 虚函数的工作原理 虚函数的工作原理 再谈虚函数虚函数是 C++ 多态性的主要体现, 指向基类的指针在操作它的多态类对象时, 会根据不同的类对象, 调用其相应的函数, 这个函数就是虚函数 虚函数工作原理在 C++ 中, 虚函数是通过虚函数表 (Virtual Table,VTABLE) 来实现的 在这个表中, 存储的是虚函数的地址表 这张表解决了继承 覆盖的问题, 保证其容真实反应实际的函数 每当创建一个包含有虚函数的类 ( 基类 ) 或从包含有虚函数的类派生一个类派生类时, 编译器就会为这个类创建一个 VTABLE 保存该类所有虚函数的地址 这个 VTABLE 的作用就是保存自己类中所有虚函数的地址 可以把 VTABLE 形象地看成一个函数指针数组, 其每个元素存放的就是虚函数的地址 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

39 虚函数的工作原理 虚函数的工作原理 再谈虚函数虚函数是 C++ 多态性的主要体现, 指向基类的指针在操作它的多态类对象时, 会根据不同的类对象, 调用其相应的函数, 这个函数就是虚函数 虚函数工作原理在 C++ 中, 虚函数是通过虚函数表 (Virtual Table,VTABLE) 来实现的 在这个表中, 存储的是虚函数的地址表 这张表解决了继承 覆盖的问题, 保证其容真实反应实际的函数 每当创建一个包含有虚函数的类 ( 基类 ) 或从包含有虚函数的类派生一个类派生类时, 编译器就会为这个类创建一个 VTABLE 保存该类所有虚函数的地址 这个 VTABLE 的作用就是保存自己类中所有虚函数的地址 可以把 VTABLE 形象地看成一个函数指针数组, 其每个元素存放的就是虚函数的地址 在每个带有虚函数的类 ( 基类和派生类 ) 中, 编译器秘密地置入虚函数指针 (V-Pointer,VPTR ) 指向类的对象的 VTABLE 当构造该派生类对象时, 其成员 VPTR 被初始化并指向该派生类的 VTABLE 因此, 可认为 VTABLE 是该类的所有对象共有, 在定义该类时被初始化 ; 而 VPTR 则是每个类对象都独有一份, 且在该类对象被构造时被初始化 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

40 虚函数的工作原理 虚函数的工作原理 假设我们有这样的一个类 Base 及其对象 b: 1 class Base 2 { 3 public: 4 virtual void f() { cout << "Base::f" << endl; } 5 virtual void g() { cout << "Base::g" << endl; } 6 virtual void h() { cout << "Base::h" << endl; } 7 }b; 总结一下 VTABLE VPTR 和类对象的关系 每一个具有虚函数的类都有一个虚函数表 VTABLE, 按虚函数在类中声明的顺序存放着虚函数的地址, 这个虚函数表 VTABLE 是这个类的所有对象所共有 在每个具有虚函数的类的对象里面都有一个 VPTR 虚函数指针, 这个指针指向 VTABLE 的首地址, 每个类的对象都有这么一种指针 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

41 虚函数的工作原理 虚函数的工作原理 当派生类中的函数与其基类虚函数原型一致时, 该函数才是 虚函数 1 class A 2 { 3 public: 4 virtual void fun() 5 { cout <<"A::fun"<<endl; } 6 }; 7 class B: public A 8 { 9 public: 10 void fun(int x=0)// 非虚函数 11 { cout <<"A::fun"<<endl; } 12 }; 13 int main 14 { 15 B b; A *pa = &b; 16 pa->fun(); b.fun(); 17 return 0; 18 } 14 class A 15 { 16 public: 17 virtual void fun() 18 { cout <<"A::fun"<<endl; } 19 }; 20 class B: public A 21 { 22 public: 23 void fun() // 虚函数 24 { cout <<"B::fun"<<endl; } 25 }; 26 int main 27 { 28 B b; A *pa = &b; 29 pa->fun(); b.fun(); 30 return 0; 31 } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

42 虚函数的工作原理 虚函数的工作原理 当派生类中的函数与其基类虚函数原型一致时, 该函数才是 虚函数 1 class A 2 { 3 public: 4 virtual void fun() 5 { cout <<"A::fun"<<endl; } 6 }; 7 class B: public A 8 { 9 public: 10 void fun(int x=0)// 非虚函数 11 { cout <<"A::fun"<<endl; } 12 }; 13 int main 14 { 15 B b; A *pa = &b; 16 pa->fun(); b.fun(); 17 return 0; 18 } 运行结果 :A::fun B::fun 14 class A 15 { 16 public: 17 virtual void fun() 18 { cout <<"A::fun"<<endl; } 19 }; 20 class B: public A 21 { 22 public: 23 void fun() // 虚函数 24 { cout <<"B::fun"<<endl; } 25 }; 26 int main 27 { 28 B b; A *pa = &b; 29 pa->fun(); b.fun(); 30 return 0; 31 } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

43 虚函数的工作原理 虚函数的工作原理 当派生类中的函数与其基类虚函数原型一致时, 该函数才是 虚函数 1 class A 2 { 3 public: 4 virtual void fun() 5 { cout <<"A::fun"<<endl; } 6 }; 7 class B: public A 8 { 9 public: 10 void fun(int x=0)// 非虚函数 11 { cout <<"A::fun"<<endl; } 12 }; 13 int main 14 { 15 B b; A *pa = &b; 16 pa->fun(); b.fun(); 17 return 0; 18 } 运行结果 :A::fun B::fun 14 class A 15 { 16 public: 17 virtual void fun() 18 { cout <<"A::fun"<<endl; } 19 }; 20 class B: public A 21 { 22 public: 23 void fun() // 虚函数 24 { cout <<"B::fun"<<endl; } 25 }; 26 int main 27 { 28 B b; A *pa = &b; 29 pa->fun(); b.fun(); 30 return 0; 31 } 运行结果 :B::fun B::fun Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

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

45 纯虚函数与抽象类 纯虚函数与抽象类 在定义基类时, 会遇到这样的情况 : 基类中虚函数的具体实现依赖于派生类, 这就导致无法定义基类中虚函数的具体实现 此时, 就需要引入纯虚函数 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

46 纯虚函数与抽象类 纯虚函数与抽象类 在定义基类时, 会遇到这样的情况 : 基类中虚函数的具体实现依赖于派生类, 这就导致无法定义基类中虚函数的具体实现 此时, 就需要引入纯虚函数 例如, 定义基类 Shape 实现对形状的通用操作, 包括求这个形状的面积 绘制这个形状的图形等 对形状的通用操作会随派生类 ( 类 Point 类 Rectangle 类 Circle 等 ) 的不同而发生变化, 所以需要在派生类中实现相关具体操作 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

47 纯虚函数与抽象类 纯虚函数与抽象类 在定义基类时, 会遇到这样的情况 : 基类中虚函数的具体实现依赖于派生类, 这就导致无法定义基类中虚函数的具体实现 此时, 就需要引入纯虚函数 例如, 定义基类 Shape 实现对形状的通用操作, 包括求这个形状的面积 绘制这个形状的图形等 对形状的通用操作会随派生类 ( 类 Point 类 Rectangle 类 Circle 等 ) 的不同而发生变化, 所以需要在派生类中实现相关具体操作 我们把基类中的通用操作定义为纯虚函数, 并把至少包含一个纯虚函数的类称为抽象类 ( 抽象数据类型 ) 定义纯虚函数的一般格式为 : 1 virtual <type> <function_name> ( [<arguments>] ) = 0 函数参数列表圆括号后面的 = 0, 表示将函数名的值赋为 0 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

48 纯虚函数与抽象类 纯虚函数与抽象类 在定义基类时, 会遇到这样的情况 : 基类中虚函数的具体实现依赖于派生类, 这就导致无法定义基类中虚函数的具体实现 此时, 就需要引入纯虚函数 例如, 定义基类 Shape 实现对形状的通用操作, 包括求这个形状的面积 绘制这个形状的图形等 对形状的通用操作会随派生类 ( 类 Point 类 Rectangle 类 Circle 等 ) 的不同而发生变化, 所以需要在派生类中实现相关具体操作 我们把基类中的通用操作定义为纯虚函数, 并把至少包含一个纯虚函数的类称为抽象类 ( 抽象数据类型 ) 定义纯虚函数的一般格式为 : 1 virtual <type> <function_name> ( [<arguments>] ) = 0 函数参数列表圆括号后面的 = 0, 表示将函数名的值赋为 0 关于纯虚函数和抽象类的使用 抽象类只能做派生类的基类, 不能定义抽象类的对象 一般而言, 纯虚函数没有函数体, 但可以给出纯虚函数的函数体 若派生类实现了基类所有的纯虚函数, 则派生类就不再是抽象类 若派生类没有实现基类所有的纯虚函数, 则派生类依然是抽象类 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

49 纯虚函数与抽象类 纯虚函数与抽象类 定义一个抽象类, 给出纯虚函数的函数体 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 virtual void fun( ) = 0; 8 }; 9 void A::fun( ) 10 { 11 cout<<"virtual fun=0"<<endl; 12 } class B: public A 15 { 16 public: 17 virtual void fun( ) 18 { cout<<"virtual fun"<<endl; } 19 }; Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

50 纯虚函数与抽象类 纯虚函数与抽象类 20 int main( ) 21 { 22 B b; 23 b.fun( ); 24 b.a::fun( ); // 调用纯虚函数的函数体 25 return 0; 26 } 程序的运行结果是 : virtual fun virtual fun=0 注意即使给出了纯虚函数的函数体, 该函数依然是纯虚函数, 含有该函数的类依然是抽象类 在本例中, 不可以定义类 A 的对象 PureVirtualFunction2.cpp Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

51 纯虚函数与抽象类 纯虚函数与抽象类 定义一个抽象类并派生出若干类, 在派生类中实现纯虚函数 1 #include <iostream> 2 using namespace std; 3 4 class Shape 5 { 6 public: 7 virtual double Area( )=0; // 抽象的求面积的纯虚函数 8 virtual void Draw( )=0; // 抽象的绘制图形的纯虚函数 9 }; 10 class Point:public Shape 11 { 12 protected: 13 double x, y; // 点的坐标值 14 public: 15 Point(double a=0, double b=0) 16 { 17 x=a; 18 y=b; 19 } Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

52 纯虚函数与抽象类 纯虚函数与抽象类 20 double Area( ) // 基类纯虚函数 Area( ) 的具体实现 21 { 22 return 0.0; 23 } 24 void Draw( ) // 基类纯虚函数 Draw( ) 的具体实现 25 { 26 cout <<"Draw Point!\n"; 27 } 28 }; 29 class Rectangle:public Point 30 { 31 protected: 32 double x1, y1; // 长方形右下角点的坐标值, 基类中 x, y 为左上角坐标点 33 public: 34 Rectangle(double a=0, double b=0, double c=0, double d=0):point(a, b) 35 { 36 x1=c; 37 y1=d; 38 } 39 double Area( ) // 基类纯虚函数 Area( ) 的具体实现 40 { 41 return (x-x1)*(y-y1); Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

53 纯虚函数与抽象类 纯虚函数与抽象类 42 } 43 void Draw( ) // 基类纯虚函数 Draw( ) 的具体实现 44 { 45 cout <<"Draw Rectangle!\n"; 46 } 47 }; 48 class Circle:public Point 49 { 50 protected: 51 double r; // 半径, 基类中 x, y 为圆心坐标点 52 public: 53 Circle(double a=0, double b=0, double c=0):point(a, b) 54 { 55 r=c; 56 } 57 double Area( ) // 基类纯虚函数 Area( ) 的具体实现 58 { 59 return 3.14*r*r; 60 } 61 void Draw( ) // 基类纯虚函数 Draw( ) 的具体实现 62 { 63 cout <<"Draw Circle!\n"; Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

54 纯虚函数与抽象类 纯虚函数与抽象类 64 } 65 }; double CalcArea(Shape &s) 68 { 69 return(s.area( )); //A 通过基类对象的引用实现动态多态 70 } void DrawShape(Shape *sp) 73 { 74 sp->draw( ); //B 通过基类对象的指针实现动态多态 75 } int main( ) 78 { 79 Point p(1, 2); 80 Rectangle r(0, 0, 1, 1); 81 Circle c(0, 0, 1); 82 cout<<calcarea(p)<< \t <<CalcArea(r)<< \t <<CalcArea(c)<< \n ; 83 DrawShape(&p); 84 DrawShape(&r); 85 DrawShape(&c); Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

55 纯虚函数与抽象类 纯虚函数与抽象类 86 return 0; 87 } 程序 (PureVirtualFunction.cpp) 的运行结果是 : Draw Point! Draw Rectangle! Draw Circle! 定义抽象类可以使编译器自动查找 创建抽象类的对象 这种错误 避免运行阶段的出错, 还可以让开发者与其他应用程序或程序员共享抽象数据类型 纯虚函数和抽象类小结 纯虚函数让 C++ 能够更健壮地支持面向对象编程 包含一个纯虚函数的类就是抽象类 ( 抽象数据类型 ) 抽象类定义了派生类都需要的成员变量和成员函数 抽象类是不能实例化的类, 不能定义抽象类的对象 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

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

57 总结与思考 总结与思考 思考 1 为什么不将类的所有成员函数都声明为虚函数? Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

58 总结与思考 总结与思考 思考 1 为什么不将类的所有成员函数都声明为虚函数? 创建 VTABLE 的开销伴随第一个虚函数的创建而发生 在此之后, 创建其他虚函数带来的开销将很小 有 C++ 程序员认为, 如果一个函数为虚函数, 那么其他所有函数也应为虚函数 但也有 C++ 程序员认为, 无论做什么都应有充分的理由 2 为何要创建抽象类? 为何不避免创建抽象数据类型? Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

59 总结与思考 总结与思考 思考 1 为什么不将类的所有成员函数都声明为虚函数? 创建 VTABLE 的开销伴随第一个虚函数的创建而发生 在此之后, 创建其他虚函数带来的开销将很小 有 C++ 程序员认为, 如果一个函数为虚函数, 那么其他所有函数也应为虚函数 但也有 C++ 程序员认为, 无论做什么都应有充分的理由 2 为何要创建抽象类? 为何不避免创建抽象数据类型? C++ 的很多规则都旨在让编译器查找 bug, 从而避免出现运行阶段的 bug 通过在类中包含纯虚函数使类成为抽象类, 编译器就可以查找 创建抽象类的对象 这种错误, 从而避免运行阶段的错误 此外, 通过定义抽象数据类型, 可以让编程者与其他应用程序或程序员共享抽象数据类型 练习 1. 哪些函数不能是虚函数? ( ) A. 构造函数 B. 析构函数 C. 克隆函数 D. 拷贝构造函数 2. 对象存储在基类变量中时,C++ 如何知道该调用哪个虚函数?( ) A. 关键词 virtual B. 根据 VTABLE C. 这不可能 D. 无法判断 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

60 总结与思考 总结与思考 思考 1 为什么不将类的所有成员函数都声明为虚函数? 创建 VTABLE 的开销伴随第一个虚函数的创建而发生 在此之后, 创建其他虚函数带来的开销将很小 有 C++ 程序员认为, 如果一个函数为虚函数, 那么其他所有函数也应为虚函数 但也有 C++ 程序员认为, 无论做什么都应有充分的理由 2 为何要创建抽象类? 为何不避免创建抽象数据类型? C++ 的很多规则都旨在让编译器查找 bug, 从而避免出现运行阶段的 bug 通过在类中包含纯虚函数使类成为抽象类, 编译器就可以查找 创建抽象类的对象 这种错误, 从而避免运行阶段的错误 此外, 通过定义抽象数据类型, 可以让编程者与其他应用程序或程序员共享抽象数据类型 练习 1. 哪些函数不能是虚函数? (A D) A. 构造函数 B. 析构函数 C. 克隆函数 D. 拷贝构造函数 2. 对象存储在基类变量中时,C++ 如何知道该调用哪个虚函数?( ) A. 关键词 virtual B. 根据 VTABLE C. 这不可能 D. 无法判断 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

61 总结与思考 总结与思考 思考 1 为什么不将类的所有成员函数都声明为虚函数? 创建 VTABLE 的开销伴随第一个虚函数的创建而发生 在此之后, 创建其他虚函数带来的开销将很小 有 C++ 程序员认为, 如果一个函数为虚函数, 那么其他所有函数也应为虚函数 但也有 C++ 程序员认为, 无论做什么都应有充分的理由 2 为何要创建抽象类? 为何不避免创建抽象数据类型? C++ 的很多规则都旨在让编译器查找 bug, 从而避免出现运行阶段的 bug 通过在类中包含纯虚函数使类成为抽象类, 编译器就可以查找 创建抽象类的对象 这种错误, 从而避免运行阶段的错误 此外, 通过定义抽象数据类型, 可以让编程者与其他应用程序或程序员共享抽象数据类型 练习 1. 哪些函数不能是虚函数? (A D) A. 构造函数 B. 析构函数 C. 克隆函数 D. 拷贝构造函数 2. 对象存储在基类变量中时,C++ 如何知道该调用哪个虚函数?( B ) A. 关键词 virtual B. 根据 VTABLE C. 这不可能 D. 无法判断 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

62 总结与思考 作业 总结与思考 阅读题 : 请写出如下多重继承中构造函数的调用顺序 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

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

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_cpp

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

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

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

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

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

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

幻灯片 1

幻灯片 1 信息科学技术学院 程序设计实习 郭炜微博 http://weibo.com/guoweiofpku http://blog.sina.com.cn/u/3266490431 刘家瑛微博 http://weibo.com/pkuliujiaying 1 信息科学技术学院 程序设计实习 郭炜刘家瑛 虚函数和多态 (P247) 2 虚函数 在类的定义中, 前面有 virtual 关键字的成员函数就是虚函数

More information

Microsoft PowerPoint - 04-Inheritance.ppt

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

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

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

幻灯片 1

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

More information

Strings

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

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

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

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

untitled

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

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

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

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

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

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

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

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

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

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

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 - 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

第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

Microsoft Word - 970617cppFinalSolution.doc

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

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

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

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

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

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

《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

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074> 程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 pengxin@fudan.edu.cn 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学

More information

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

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

第七讲 继承与多态

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

More information

FY.DOC

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

More information

绘制OpenCascade中的曲线

绘制OpenCascade中的曲线 在 OpenSceneGraph 中绘制 OpenCascade 的曲线 Draw OpenCascade Geometry Curves in OpenSceneGraph eryar@163.com 摘要 Abstract: 本文简要说明 OpenCascade 中几何曲线的数据, 并将这些几何曲线在 OpenSceneGraph 中绘制出来 关键字 KeyWords:OpenCascade Geometry

More information

Microsoft PowerPoint - 7. 面向对象程序设计-Object-Oriented Programming.ppt [兼容模式]

Microsoft PowerPoint - 7. 面向对象程序设计-Object-Oriented Programming.ppt [兼容模式] 面向对象程序设计 Object-Oriented Programming(OOP) Classes,Inheritance, Polymorphism A Survey of Programming Techniques Unstructured programming, procedural programming, modular programming and object-oriented

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

Guava学习之Resources

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

More information

面向对象的程序设计 : 抽象 继承和多态 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 38

面向对象的程序设计 : 抽象 继承和多态 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 38 程序设计与算法语言 继承与派生 C/C++ Programming and Algorithms Inheritance and Derivation Dongke Sun ( 孙东科 ) dksun@seu.edu.cn 东南大学机械工程学院 School of Mechanical Engineering Southeast University April 12, 2018 面向对象的程序设计

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

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

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

C++_Lecture

C++_Lecture C++ 程序设计 张岳新编著 苏州大学出版社 1 第十一章 继承和派生类 2 继承性是面向对象程序设计中最重要的机制 这种机制提供了无限重复利用程序资源的一种途径 通过 C++ 语言中的继承机制, 可以扩充和完善旧的程序设计以适应新的需求 这样不仅可以节省程序开发的时间和资源, 并且为未来程序增添了新的资源 3 class Student { int num; char name[30]; char

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

新版 明解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

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

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

More information

Microsoft PowerPoint - 第07讲_多态1.ppt [兼容模式]

Microsoft PowerPoint - 第07讲_多态1.ppt [兼容模式] 程序设计实习 (I): C++ 程序设计 第七讲多态 上节内容回顾 基本概念 : 继承 基类 派生类 派生类的成员组成 可见性 派生类的构造 析构 派生类与基类的指针类型转换 2 回顾 : public 继承 class base { private: int m; public: int q; base(int ti=0):m(i){} }; class derived : public base

More information

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

OOP with Java 通知 Project 3: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 4 月 19 日晚 9 点 复习 Upcasting 同一基类的不同子类可以被视为同一类型 ( 基类 ) 放宽类型一致性 简化接口 class A{ class B{ A a = new A(); B b = new B(); // A a = new B(); compile

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

程序设计与算法语言 拷贝构造 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

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

Strings

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

More information

0 2 7 3 4 6 7 9 8 10 2 9 3 4 5 6 7 3 4 5 6 7 10 2 3 4 6 7 9 10 10 3 4 5 7 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 1. 2. 1. 2. 1. 2. 1. 2. 1. 2. 1. 2. 1. 2. 1. 2. 2 1. 2.

More information

小班上学期课程

小班上学期课程 1 2 3 4 5 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 6 7 8 9 10 11 12 13 : 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

More information

提问袁小兵:

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

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

目录 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

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

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D>

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

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

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

<4D F736F F F696E74202D20B5DA39D5C220C3E6CFF2B6D4CFF3D3EFD1D4B5C4B1E0D2EB2E BBCE6C8DDC4A3CABD5D>

<4D F736F F F696E74202D20B5DA39D5C220C3E6CFF2B6D4CFF3D3EFD1D4B5C4B1E0D2EB2E BBCE6C8DDC4A3CABD5D> 第 9 章 面向对象语言的编译 本章内容 概述面向对象语言的重要概念和实现技术 以 C++ 语言为例, 介绍如何将 C++ 程序翻译 成 C 程序 实际的编译器大都把 C++ 程序直接翻译成低 级语言程序 91 9.1 面向对象语言的概念 9.1.1 对象和对象类 对象 由一组属性和操作于这组属性的过程组成 属性到值的映射称为对象的状态, 过程称为方法 对象类 一类对象的总称, 规范了该类中对象的属性和方法,

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

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

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

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

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! 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

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

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc 2 5 8 11 0 1. 13 2. 15 3. 18 1 1. 22 2. 25 3. 27 2 1. 35 2. 38 3. 41 4. 43 5. 48 6. 50 3 1. 56 2. 59 3. 63 4. 65 5. 69 13 22 35 56 6. 74 7. 82 8. 84 9. 87 10. 97 11. 102 12. 107 13. 111 4 114 1. 114 2.

More information

Microsoft PowerPoint - ch12 [Compatibility Mode]

Microsoft PowerPoint - ch12 [Compatibility Mode] 第十二章 面向对象语言的编译 本章内容 概述面向对象语言的重要概念和实现技术 以 C++ 语言为例, 介绍如何将 C++ 程序翻译成 C 程序 实际的编译器大都把 C++ 程序直接翻译成低级语言程序 12.1 面向对象语言的概念 12.1.1 对象和对象类 对象 由一组属性和操作于这组属性的过程组成 属性到值的映射称为对象的状态, 过程称为方法 对象类 一类对象的总称, 规范了该类中对象的属性和方法,

More information

Microsoft Word - chap10.doc

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

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

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

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

Microsoft PowerPoint - plan08.ppt

Microsoft PowerPoint - plan08.ppt 程 序 设 计 语 言 原 理 Principle of Programming Languages 裘 宗 燕 北 京 大 学 数 学 学 院 2012.2~2012.6 8. 面 向 对 象 为 什 么 需 要 面 向 对 象? OO 语 言 的 发 展 面 向 对 象 的 基 本 概 念 封 装 和 继 承 初 始 化 和 终 结 处 理 动 态 方 法 约 束 多 重 继 承 总 结 2012

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Fortran Algol Pascal Modula-2 BCPL C Simula SmallTalk C++ Ada Java C# C Fortran 5.1 message A B 5.2 1 class Vehicle subclass Car object mycar public class Vehicle extends Object{ public int WheelNum

More information

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

C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1 C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1 1 SWAP 1 Swap 题目描述 用函数模板的方式实现对不同数据类型的数组中的数据进行输入 从小到大排序和输出 使用如下主函数测试你的模板设计一个函数模板 Swap, 实现任意数据类型的两个数据的交换, 分别用 int 型 double 型和 char 型的数据进行测试 main 函数如下 : int main()

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

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++ 程序设计 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

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 - 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

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

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

More information

運算子多載 Operator Overloading

運算子多載 Operator Overloading 多型 Polymorphism 講師 : 洪安 1 多型 編譯時期多型 ( 靜態多型 ) function overloading 如何正確呼叫同名的函數? 利用參數個數與型態 operator overloading 其實同 function overloading 執行時期多型 ( 或動態多型 ) 如何正確呼叫不同物件的相同名稱的成員函數 利用繼承與多型 2 子類別與父類別物件間的指定 (assignment)

More information

华侨大学 2014 年硕士研究生入学考试专业课试卷 B ( 答案必须写在答题纸上 ) 招生专业 计算机技术 科目名称 数据结构与 C++ 科目代码 850 第一部分 C++ ( 总分 75 分 ) 一 单项选择题 (18 分, 每小题 2 分 ) 1. 若有定义 :int a[3][4];, 则表达

华侨大学 2014 年硕士研究生入学考试专业课试卷 B ( 答案必须写在答题纸上 ) 招生专业 计算机技术 科目名称 数据结构与 C++ 科目代码 850 第一部分 C++ ( 总分 75 分 ) 一 单项选择题 (18 分, 每小题 2 分 ) 1. 若有定义 :int a[3][4];, 则表达 华侨大学 2014 年硕士研究生入学考试专业课试卷 B ( 答案必须写在答题纸上 ) 招生专业 计算机技术 科目名称 数据结构与 C++ 科目代码 850 第一部分 C++ ( 总分 75 分 ) 一 单项选择题 (18 分, 每小题 2 分 ) 1. 若有定义 :int a[3][4];, 则表达式 sizeof(a)/sizeof(int[4]) 的值为 ( ) A) 3 B) 4 C) 5 D)

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

海 南 冯 琳 峰 海 南 省 锅 炉 压 力 容 器 与 特 种 设 备 检 验 所 海 南 省 定 安 县 白 蒙 路 47 号 570203 信 XC22043618311 内 蒙 古 冯 磊 赤 峰 市 特 种 设 备 检 验 所 内 蒙 古 赤 峰 市 红 山 区 八 里 铺 油 库 路

海 南 冯 琳 峰 海 南 省 锅 炉 压 力 容 器 与 特 种 设 备 检 验 所 海 南 省 定 安 县 白 蒙 路 47 号 570203 信 XC22043618311 内 蒙 古 冯 磊 赤 峰 市 特 种 设 备 检 验 所 内 蒙 古 赤 峰 市 红 山 区 八 里 铺 油 库 路 2015 年 容 器 检 验 员 取 证 邮 寄 证 书 查 询 邮 寄 日 期 2016.2.26 查 询 网 址 http://yjcx.chinapost.com.cn/zdxt/yjcx/ 省 份 姓 名 工 作 单 位 通 信 地 址 邮 政 编 码 挂 号 号 码 山 东 丁 宪 振 山 东 省 特 种 设 备 检 验 研 究 院 山 东 省 济 南 市 高 新 区 天 辰 大 街 939

More information

Microsoft Word - 第3章.doc

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

More information

地 理 志 鏡 止 煞, 來 達 到 安 宅 的 效 果 4. 門 神 符 紙 : 於 門 板 繪 製 門 神, 作 為 宅 第 的 守 護, 民 宅 所 使 用 的 門 神 題 材, 多 為 天 官 賜 福 或 文 武 官 員 符 紙 是 以 畫 了 符 咒 的 紙 懸 掛 室 內, 或 加 框

地 理 志 鏡 止 煞, 來 達 到 安 宅 的 效 果 4. 門 神 符 紙 : 於 門 板 繪 製 門 神, 作 為 宅 第 的 守 護, 民 宅 所 使 用 的 門 神 題 材, 多 為 天 官 賜 福 或 文 武 官 員 符 紙 是 以 畫 了 符 咒 的 紙 懸 掛 室 內, 或 加 框 第 二 篇 - 人 文 地 理 ( 五 ) 民 宅 的 祈 福 辟 邪 物 臺 灣 早 期 移 民, 因 為 離 鄉 背 井, 對 於 新 環 境 的 陌 生, 以 及 生 存 的 不 容 易, 再 加 上 承 襲 閩 粵 地 區 的 習 慣, 所 以 住 屋 講 究 的 是 祈 福 辟 邪 除 了 建 屋 之 前 要 看 地 理 風 水, 在 建 屋 時 更 有 許 多 禁 忌 要 遵 守 另 外,

More information

模板

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

More information

<4D F736F F D B0EAA5C1A470BEC7A4CEB0EAA5C1A4A4BEC7B8C9B1CFB1D0BEC7B9EAAC49A4E8AED7>

<4D F736F F D B0EAA5C1A470BEC7A4CEB0EAA5C1A4A4BEC7B8C9B1CFB1D0BEC7B9EAAC49A4E8AED7> 國 民 小 學 及 國 民 中 學 補 救 教 學 實 施 方 案 中 華 民 國 100 年 10 月 27 日 臺 國 ( 二 ) 字 第 1000193000 號 函 中 華 民 國 103 年 1 月 24 日 臺 教 國 署 國 字 第 1030004427 號 函 壹 方 案 緣 起 教 育 是 國 家 經 濟 社 會 發 展 的 重 要 投 資, 落 實 教 育 機 會 均 等 的 理

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information