一、C++程序到C程序的翻译
程序示例分析:
C++:
class CCar { public: int price; void SetPrice (int p); }; void CCar::SetPrice (int p) { price = p; } int main() { CCar car; car.SetPrice(20000); return 0; }
C:
struct CCar { int price; }; void SetPrice(struct CCar * this,int p) { this->price = p; } int main() { struct CCar car; SetPrice( & car,20000); return 0; }
拆分
(1)C++
class CCar { public: int price; void SetPrice (int p); };
C
struct CCar { int price; };
(2)C++
void CCar::SetPrice (int p) { price = p; }
C
void SetPrice (struct CCar * this,int p) { this->price = p; }
(3)C++
int main() { CCar car; car.SetPrice(20000); return 0; }
C
int main() { struct CCar car; SetPrice( & car,20000); return 0; }
二、this指针的作用
其作用就是指向成员函数所作用的对象
非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针。
程序示例分析:
(1)
class Complex { public: double real, imag; void Print() { cout << real << "," << imag ; } Complex(double r,double i):real(r),imag(i){ } Complex AddOne() { this->real ++; //等价于 real ++; this->Print(); //等价于 Print return * this;} }; int main() { Complex c1(1,1),c2(0,0); c2 = c1.AddOne(); return 0; }
输出:2,1
(2)
class A { inti; public: void Hello() { cout << "hello" << endl; } }; int main() { A * p = NULL; p->Hello(); }
输出:hello
拆分:
1)C++
void Hello() { cout << "hello" << endl; }
C
void Hello(A * this ) { cout << "hello" << endl; }
2)C++
p->Hello();
C
Hello(p);
(3)
class A { int i; public: void Hello() { cout << i << "hello" << endl; } }; int main() { A * p = NULL; p->Hello(); }
出错!!!
拆分:
1)C++
p->Hello();
C
Hello(p);
2)C++
void Hello() { cout << i << "hello" << endl; }
C
void Hello(A * this ) { cout << this->i << "hello"<< endl; }
this为NULL,出错!!
静态成员函数中不能使用 this 指针!
因为静态成员函数并不具体作用与某个对象!
因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数!
Question:
以下说法不正确的是:
A) 静态成员函数中不能使用this指针
B) this指针就是指向成员函数所作用的对象的指针
C) 每个对象的空间中都存放着一个this指针
D) 类的非静态成员函数,真实的参数比所写的参数多1
答案:C
三、在多个文件中使用类
在有多个文件的C++程序中,如果多个.cpp文件都用到同一个类,可以将类的定义写在一个头文件中,然后在各个.cpp文件中包含该头文件。类的非内联成员函数的函数体只能出现在某一个.cpp文件中,不能放在头文件中被多个.cpp文件包含,否则链接时会发生重复定义的错误。类的内联成员函数的函数体最好写在头文件中,这样编译器在处理内联函数的调用语句时,就能在本文件包含的头文件中找到内联函数的代码,并将这些代码插入调用语句处。内联成员函数放在头文件中被多个.cpp文件包含,不会导致重复定义的错误。