Liny_@NotePad

沉迷ACG中

C++中的this指针

 this总是指向当前对象,每次执行成员函数时,形如本例中的SetColor(int _color),总是会被编译成SetColor(CTestThis* this, int _color),编译器会自动带入对象地址作为this指针所指向的地址,本例中的全局函数也许可以加深对this指针的理解。

  1. #include <iostream>
  2.  
  3. class CTestThis
  4. {
  5. public:
  6.         int GetColor() { return this->color; }
  7.         void SetColor(int _color) { this->color = _color; }
  8.         void Display() { std::cout << this->color << std::endl; }
  9.  
  10. private:
  11.         int color;
  12. };
  13.  
  14. void SetColor(int _color, CTestThis* _)
  15. {
  16.         _->SetColor(_color);
  17. }
  18.  
  19. void Display(CTestThis* _)
  20. {
  21.         std::cout << _->GetColor() << std::endl;
  22. }
  23.  
  24. void main(void)
  25. {
  26.         CTestThis test;
  27.  
  28.         test.SetColor(3);
  29.         test.Display();
  30.  
  31.         SetColor(33, &test);
  32.         Display(&test);
  33.  
  34.         system("pause");
  35. }

C++的继承与多态demo

继承(无虚函数):

  1. #include <iostream>
  2.  
  3. class A
  4. {
  5. public:
  6.         void fun() { std::cout << "A::fun()" << std::endl; }
  7. };
  8.  
  9. class B: public A
  10. {
  11. public:
  12.         void fun() { std::cout << "B::fun()" << std::endl; }
  13.         void fun2() { std::cout << "B::fun2()" << std::endl; }
  14. };
  15.  
  16. void main(void)
  17. {
  18.         A a;
  19.         a.fun();                //      A::fun()
  20.  
  21.         B b;
  22.         b.fun();                //      B::fun()
  23.         b.fun2();              //     B::fun2()
  24.  
  25.         A* rA = &b;
  26.         rA->fun();            //    A::fun()
  27.         std::cout << &b << " " << rA << std::endl;
  28.        
  29.         B* rB = static_cast<B*> (&a);
  30.         rB->fun();            //    B::fun()
  31.         rB->fun2();          //   B::fun2()
  32.         std::cout << &a << " " << rB << std::endl;
  33.  
  34.         system("pause");
  35. }

多态:

  1. #include <iostream>
  2.  
  3. class A
  4. {
  5. public:
  6.         virtual void fun(void) { std::cout << "A::fun()" << std::endl; }
  7. };
  8.  
  9. class B: public A
  10. {
  11. public:
  12.         void fun(void) { std::cout << "B::fun()" << std::endl; }
  13.         void fun2(void) { std::cout << "B::fun2()" << std::endl; }
  14. };
  15.  
  16. void main(void)
  17. {
  18.         A a;
  19.         a.fun();                //      A::fun()
  20.  
  21.         B b;
  22.         b.fun();                //      B::fun()
  23.         b.fun2();              //     B::fun2()
  24.  
  25.         A* rA = &b;
  26.         rA->fun();            //    B::fun()
  27.  
  28.         B* rB = static_cast<B*> (&a);
  29.         rB->fun();            //    A::fun()
  30.         rB->fun2();          //   B::fun2()
  31.  
  32.         system("pause");
  33. }

C++对象布局及多态实现的探索

系列文章:http://c.chinaitlab.com/special/dxdtbj/Index.html

(一)前言:http://c.chinaitlab.com/cc/basic/200906/787895.html
普通类对象:http://c.chinaitlab.com/cc/basic/200906/787895_2.html
普通继承类对象:http://c.chinaitlab.com/cc/basic/200906/787895_3.html

(二)虚函数的类的对象:http://c.chinaitlab.com/cc/basic/200906/787896.html
(三)虚函数的类的对象(2):http://c.chinaitlab.com/cc/basic/200906/787897.html

(四)类型动态转换和类型强制转换:http://c.chinaitlab.com/cc/basic/200906/787898.html

(五)普通成员函数的调用:http://c.chinaitlab.com/cc/basic/200906/787899.html

(六)虚函数调用:http://c.chinaitlab.com/cc/basic/200906/787900.html

(七)构造函数中的虚函数调用:http://c.chinaitlab.com/cc/basic/200906/787901.html

(八)普通的虚继承:http://c.chinaitlab.com/cc/basic/200906/787902.html

(九)菱形结构的虚继承:http://c.chinaitlab.com/cc/basic/200906/787903.html
(十)菱形结构的虚继承(2):http://c.chinaitlab.com/cc/basic/200906/787904.html
(十一)菱形结构的虚继承(3):http://c.chinaitlab.com/cc/basic/200906/787905.html

(十二)后记:http://c.chinaitlab.com/cc/basic/200906/787906.html

(十三)代码中定义的类的简单说明:http://c.chinaitlab.com/cc/basic/200906/787907.html

VS2005下各基本类型的size

系统信息
 操作系统 Windows XP Professional SP2
 编译环境 Microsoft Visual Studio 2005
 CPU Pentium(R) Dual-Core CPU E5200 @ 2.50 GHz

基本类型

 数据类型 大小 
 int  4
 char  1
 long  4
 double  8
 float  4
 short  2
 bool  1

【20090820】C++培训日记-进阶1

今天学习的内容:this指针、继承(不使用虚函数)、多态、单继承与虚函数表

类模板练习

 rt。。第一次玩这东西 = =

  1. #include <iostream>
  2.  
  3. template <class T>
  4. class CTem
  5. {
  6. public:
  7.         CTem(int i);
  8.         ~CTem(void)
  9.         {
  10.                 delete[] data;
  11.         }
  12.  
  13.         T& operator [](int i)
  14.         {
  15.                 return data[i];
  16.         }
  17.  
  18. private:
  19.         T* data;
  20. };
  21.  
  22. template <class T>
  23. CTem<T>::CTem(int n)
  24. {
  25.         data = new T[n];
  26. }
  27.  
  28. void main(void)
  29. {
  30.         CTem<int> tem(5);
  31.        
  32.         for(int i=0; i<5; i++)
  33.         {
  34.                 tem[i] = i+1;
  35.         }
  36.  
  37.         for(int i=0; i<5; i++)
  38.         {
  39.                 std::cout << tem[i] << " ";
  40.         }
  41.         std::cout << std::endl;
  42.  
  43.         system("pause");
  44. }

C++里的静态成员函数为何不能用const?

细看const成员函数的定义:不会修改该对象的数据成员。
我们知道,访问成员函数时会自动带上this,形如CTest::SetColor(int color),会自动转换成CTest::SetColor(CTest* this, int color)。
在const成员函数时,实际转换成了CTest::SetColor(const CTest* this, int color)。
this指向的是一个const对象,const对象的数据成员是不能改变的。
而静态成员函数实际上是一个全局函数,没有this指针,根本不会访问到对象的数据成员,在此使用const就多此一举了。

c++中const详细解释

转自:http://blog.csdn.net/eroswang/archive/2009/05/20/4204693.aspx