http://blog.csdn.net/ab198604/article/details/18946457
前一篇文章中说到,内联成员函数的定义有两种方式,一种是在类体内部直接定义,第二种是在类体外定义。下面是代码:
第一种定义方式:
- class Test
- {
- public:
- void add(int a, int b) //类体中直接定义时为内联函数。
- {
- return a+b;
- }
- };
- inline Test::add(int a, int b) //在类体外定义
- {
- return a+b;
- }
下面讲讲成员函数的重载
成员函数的重载是有条件的,首先必须具有相同的作用域,且参数不同(可以是参数类型不同,参数个数不同,参数顺序不同),函数名相同。这样的成员函数才构成重载。下面是重载的例子:
- class Test
- {
- public:
- void Init();
- void Init(int x);
- void Init(int x, int y);
- void Init(int x, int y, int z);
- //void Init(int x=0, int y= 0, int z= 0 ); //与void Init();函数产生了二义性,编译器无法区分
- };
类与结构体(struct 与 class)
在C中的结构体struct其实与C++中的class有点类似的,它们都可以将各种数据结构与方法封闭在一个容器中。唯一的区别在于:在未指定访问权限时,struct默认是public的,而class默认是private的。如下:
- class Test
- {
- int x; //actually x is private.
- };
- struct Test
- {
- int x; //x is public
- };
- struct Test2
- {
- int x_;
- int y_;
- int z_;
- void Init(int x, int y, int z)
- {
- x_ = x;
- y_ = y;
- z_ = z;
- }
- };
- class Test3
- {
- int x_;
- int y_;
- int z_;
- void Init(int x, int y, int z )
- {
- x_ = x;
- y_ = y;
- z_ = z;
- }
- };
- int main()
- {
- Test2 t; //在C++中,struct也是一个类,不需要加上struct
- t.Init(10,20,30);
- Test2 t2 = {10,20,30}; //C中结构体的初始化,这是允许的
- Test3 t3;
- t3.Init(10,20,30);//Error,Init在t3中是private的,外部无法直接访问
- Test3 t4 = {10,20,30}; //Error,在class中,数据成员为private,不能像struct那样初始化。
- }
关于this指针
为了搞清this指针,需要了解一个背景:在C++中,成员函数的代码对所有对象而言是共享的,而每个对象的数据成员空间各自独立,那么当每个对象都调用成员函数时,成员函数如何区别它应该操作哪一个对象的数据呢?换句话说,成员函数怎么知道它要操作的是调用它的对象的数据成员?这主要是C++编译器来完成,C++编译器在每次成员函数调用时,在第一个参数会增加一个对象的指针,以告诉成员函数它要操作的是哪个对象的数据。编译器传递的这个指针是不可见的,是隐含的。
我们程序代码中调用成员函数是这样的:
- Test t1;
- t1.Init(10,20,30);
而编译器处理后,是这样的:
- Test t1;
- t1.Init(&t1, 10, 20, 30);