论坛首页 编程语言技术论坛

成员函数 this指针 可变数据成员

浏览 3062 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-16  
C++

类的成员函数可以访问该类的 private 成员

 

每个成员函数(除了static 成员函数外)都有一个额外的、隐含的形参 this,在调用成员函数时,形

参 this 初始化为调用函数的对象的地址

 

使用 const 的函数称为常量成员函数,由于this 是指向 const 对象的指针,const 成员函数不能

修改调用该函数的对象

 

const 对象、指向 const 对象的指针或引用只能用于调用其 const 成员函数,如果尝试用它们来调

用非 const 成员函数,则是错误的

 

在成员函数中,不必显式地使用 this 指针来访问被调用函数所属对象的成员,对这个类的成员的任

何没有前缀的引用,都被假定为通过指针 this 实现的引用

 

由于 this 指针是隐式定义的,因此不需要在函数的形参表中包含 this 指针,实际上,这样做也是

非法的

 

在类的定义外面定义成员函数必须指明它们是类的成员,使用作用域操作符 ::

 

对于成员函数,函数声明必须与其定义一致,如果函数被声明为 const 成员函数,那么函数定义时

形参表后面也必须有 const

 

构造函数是特殊的成员函数,与其他成员函数不同,构造函数和类同名,而且没有返回类型

 

一个类可以有多个构造函数,每个构造函数必须有与其他构造函数不同数目或类型的形参

 

构造函数通常应确保其每个数据成员都完成了初始化

 

构造函数也必须在类中声明,但是可以在类中或类外定义

 

在冒号和花括号之间的代码称为构造函数的初始化列表,为类的一个或多个数据成员指定初值,它跟

在构造函数的形参表之后,以冒号开关

 

构造函数的初始化式是一系列成员名,每个成员后面是括在圆括号中的初始值,多个成员的初始化用

逗号分隔

 

如果没有为一个类显式定义任何构造函数,编译器将自动为这个类生成默认构造函数

 

合成的默认构造函数不会自动初始化内置类型的成员

 

合成的默认构造函数一般适用于仅包含类类型成员的类,而对于含有内置类型或复合类型成员的类,

则通常应该定义他们自己的默认构造函数初始化这些成员

 

可以通过对 this 指针解引用来访问 this 指向的对象

 

在普通的非 const 成员函数中,this 的类型是一个指向类类型的 const 指针

 

在 const 成员函数中,this 的类型是一个指向 const 类类型对象的 const 指针

 

不能从 const 成员函数返回指向类对象的普通引用,const 成员函数只能返回 *this 作为一个

const 引用

 

基于成员函数是否为 const,可以重载一个成员函数;同样地,基于一个指针形参是否指向 const,

可以重载一个函数,const 对象只能使用 const 成员,非 const 对象可以使用任一成员,但非

const 版本是一个更好的匹配

 

有时(但不是很经常),我们希望类的数据成员(甚至在 const 成员函数内)可以修改,这可以通过将

它们声明为 mutable 来实现

 

可变数据成员(mutable data member)永远都不能为 const,甚至当它是 const 对象的成员时也如此
const 成员函数可以改变 mutable 成员

 

要将数据成员声明为可变的,必须将关键字 mutable 放在成员声明之前

 

#include <iostream>
using namespace std;

class Screen {
private:
    char c;
    mutable int count;
    // single function to do the work of displaying a Screen,
    // will be called by the display operations
    void do_display(ostream &os) const
    { 
     os << "count : " << ++count << endl;
     os << c << endl;; 
    }
public:
    // interface member functions
    // display overloaded on whether the object is const or not
    Screen& display(ostream &os)
    { 
            os << "no const ..." << endl;
            do_display(os); 
            return *this; 
    }
    const Screen& display(ostream &os) const
    { 
          os << "const..." << endl;
          do_display(os); 
          return *this; 
    }
    Screen():c(' '),count(0) {}
    Screen(char ch):c(ch),count(0) {}
};

int main()
{    
    Screen sa('a');
    const Screen sb('b');
    sa.display(cout); // calls nonconst version
    sb.display(cout); // calls const version count 1
    sb.display(cout); // count 2
    
    return 0;
}

 

 

 

 

 

 

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics