`
clskkk2222
  • 浏览: 33954 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
  • NeuronR: 引用因为用于向函数传递对象和从函数返回对象,该构造函数一般不应 ...
    复制构造函数

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

    博客分类:
  • 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;
}

 

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    visualC++2010入门经典源代码

    5.5.1 接受数量可变实参的函数 241 5.5.2 main( )的实参 242 5.6 小结 243 5.7 练习 243 5.8 本章主要内容 244 第6章 程序结构(2) 245 6.1 函数指针 245 6.1.1 声明函数指针 246 6.1.2 函数指针作为...

    -C++参考大全(第四版) (2010 年度畅销榜

    13.4 this指针 13.5 指向派生类型的指针 13.6 指向类成员的指针 13.7 引用 13.8 格式问题 13.9 C++的动态分配运算符 第14章 函数重载、拷贝构造函数和默认变元 14.1 函数重载 14.2 重载构造函数 14.3 拷贝构造函数 ...

    [Visual.C++.2010入门经典(第5版)].Ivor.Horton.part1

    5.5.1 接受数量可变实参的函数 241 5.5.2 main( )的实参 242 5.6 小结 243 5.7 练习 243 5.8 本章主要内容 244 第6章 程序结构(2) 245 6.1 函数指针 245 6.1.1 声明函数指针 246 6.1.2 函数指针作为实参 249 6.1.3 ...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     7.3.2 返回*this的成员函数 246  7.3.3 类类型 249  7.3.4 友元再探 250  7.4 类的作用域 253  7.4.1 名字查找与类的作用域 254  7.5 构造函数再探 257  7.5.1 构造函数初始值列表 258  7.5.2 委托构造函数...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     7.3.2 返回*this的成员函数 246  7.3.3 类类型 249  7.3.4 友元再探 250  7.4 类的作用域 253  7.4.1 名字查找与类的作用域 254  7.5 构造函数再探 257  7.5.1 构造函数初始值列表 258  7.5.2 委托构造函数...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    5.5.1 接受数量可变实参的函数 5.5.2 main()的实参 5.6 小结 5.7 练习 第6章 程序结构(2) 6.1 函数指针 6.1.1 声明函数指针 6.1.2 函数指针作为实参 6.1.3 函数指针的数组 6.2 初始化函数形参 6.3 异常 6.3.1 抛出...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    5.5.1 接受数量可变实参的函数 5.5.2 main()的实参 5.6 小结 5.7 练习 第6章 程序结构(2) 6.1 函数指针 6.1.1 声明函数指针 6.1.2 函数指针作为实参 6.1.3 函数指针的数组 6.2 初始化函数形参 6.3 异常 6.3.1 抛出...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    5.5.1 接受数量可变实参的函数 5.5.2 main()的实参 5.6 小结 5.7 练习 第6章 程序结构(2) 6.1 函数指针 6.1.1 声明函数指针 6.1.2 函数指针作为实参 6.1.3 函数指针的数组 6.2 初始化函数形参 6.3 异常 6.3.1 抛出...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    5.5.1 接受数量可变实参的函数 5.5.2 main()的实参 5.6 小结 5.7 练习 第6章 程序结构(2) 6.1 函数指针 6.1.1 声明函数指针 6.1.2 函数指针作为实参 6.1.3 函数指针的数组 6.2 初始化函数形参 6.3 异常 6.3.1 抛出...

    Visual C++ 2005入门经典.part06.rar (整理并添加所有书签)

    5.5.1 接受数量可变实参的函数 5.5.2 main()的实参 5.6 小结 5.7 练习 第6章 程序结构(2) 6.1 函数指针 6.1.1 声明函数指针 6.1.2 函数指针作为实参 6.1.3 函数指针的数组 6.2 初始化函数形参 6.3 异常 6.3.1 抛出...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    5.5.1 接受数量可变实参的函数 5.5.2 main()的实参 5.6 小结 5.7 练习 第6章 程序结构(2) 6.1 函数指针 6.1.1 声明函数指针 6.1.2 函数指针作为实参 6.1.3 函数指针的数组 6.2 初始化函数形参 6.3 异常 6.3.1 抛出...

    C++ Primer第四版【中文高清扫描版】.pdf

    12.2 隐含的this指针 376 12.3 类作用域 380 类作用域中的名字查找 382 12.4 构造函数 385 12.4.1 构造函数初始化式 387 12.4.2 默认实参与构造函数 391 12.4.3 默认构造函数 392 12.4.4 隐式类类型转换 393 12.4.5 ...

    LuaBind 源码 (Lua增强库)

    可变个数的参数. 这使得你可以指定调用的策略.你可以通过 operator[] 来实现 这个功鞥.你可以同过方括号来指定策略,例如: int ret = call_function( L , "a_lua_function" , new complex_class() )[ adopt(_1) ]; ...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    19.1.3 常量迭代器和可变迭代器 562 19.1.4 反向迭代器 563 19.1.5 其他几种迭代器 565 19.2 容器 566 19.2.1 连续容器 566 19.2.2 容器适配器栈和队列 570 19.2.3 关联容器集合和映射 572 19.2.4 效率 575...

    Visual C++ 2005入门经典--源代码及课后练习答案

    5.5.1 接受数量可变实参的函数 242 5.5.2 main( )的实参 243 5.6 小结 244 5.7 练习 245 第6章 程序结构(2) 246 6.1 函数指针 246 6.1.1 声明函数指针 247 6.1.2 函数指针作为实参 250 6.1.3 函数...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    5.5.1 接受数量可变实参的函数 241 5.5.2 main( )的实参 242 5.6 小结 243 5.7 练习 243 5.8 本章主要内容 244 第6章 程序结构(2) 245 6.1 函数指针 245 6.1.1 声明函数指针 246 6.1.2 函数指针作为实参 249...

    [原创]自己工作中常用的模板库,简化你的工作

    本库采用了封装,可以支持模板函数的回调,并且支持最多7个可变参数(可以简易扩充参数个数)。 可以遍历一个TypeList或者枚举值范围CEnumRange,然后以满足条件的类型回调用户的模板函数。 其广泛的应用场景即是...

    C#语言规范(4.0版本)

    10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 ...

    微软C#语言规范,C#语言教程中文版

    10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 ...

    C#语言规范4.0

    10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 ...

Global site tag (gtag.js) - Google Analytics