12this和const

this指针

1.一个类的多个对象各自拥有类的数据成员的一个副本

2.类的成员函数则被其所有对象共享

3.一个类的不同对象响应相同的消息时,调用的是同一个函数

4.每个对象都有一个指向自身的this指针

5.对象调用成员函数时会将自己的this指针传递给成员函数(隐含参数)

6.成员函数访问对象的所有数据成员都是通过this指针访问,如

double Column::volume(Column *this)

{

 return this-> height

        * this-> circle.area();

}

// this指针可以在成员函数中显式使用

7.this指针的另外一个作用——访问对象自身(*this)

示例:

   #include <iostream.h>

   class Test

   {public:

     Test(int n = 0);

     Test & setData(int n);

     void print();

    private:

     int data;

   };

   Test::Test(int n)

   {data = n;

   }

   Test & Test::setData(int n)

   {data = n;

    return *this;

   }

   void Test::print()

   {cout<<"data = "<<data<<"!"<<endl;

   }

   main()

   {Test obj1;

    cout<<"obj1: ";

    obj1.setData(100).print();

    return 0;

   }

成员函数setData返回类型是Test &,返回值是*this

一个对象调用成员函数setData将获得该对象的引用——连续调用的关键

obj1.setData(100).print(); 正确

 

注意:

类的静态成员函数为什么不能访问非静态数据成员?

1.静态成员函数(属于类)没有维护this指针

2.访问非静态数据成员(属于对象)需要this指针

静态成员函数为什么不能调用非静态成员函数

1.调用非静态成员函数需要一个隐含参数(this指针)

2.静态成员函数没有

 

 

const特性

1.对象应用的最低访问权原则

2.有些对象不能被修改——让它不能被修改

3.有些成员函数不需要修改对象的数据成员——不让它修改数据成员

4.const对象——不能被修改的对象

5.const成员函数——不能修改数据成员的成员函数

 

声明const对象

const Circle baseCircle(0, 0, 1);

声明const成员函数

void Test::print( ) const

{   cout<<"data = "<<data<<"!\n"; }

声明const数据成员

和声明普通const变量的方法相同(初始化方式不同)

 

const约束

const对象不能调用非const成员函数

const成员函数不能调用非const成员函数

非构造函数、析构函数不能修改const对象

 

示例:

   class Circle

   {public:

     Circle(double a = 5.0,

           double b = 5.0,double c = 5.0);

    private:

     double x, y;     //x、y坐标

     const double r;      //半径

   };

   Circle::Circle(double a,double b, double c):r(c) //const数据成员的初始化

   {x = a;

    y = b;

   }

 

posted @ 2018-01-09 16:49  gd_沐辰  阅读(152)  评论(0编辑  收藏  举报