`
clskkk2222
  • 浏览: 34900 次
  • 性别: 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
分享到:
评论

相关推荐

    C++将类的成员函数作为回调函数

    然而,当涉及到类的成员函数时,事情变得稍微复杂了一些。这是因为成员函数通常需要访问所属类的`this`指针来引用当前对象,而标准的回调机制往往期望的是一个全局或静态函数,而不是成员函数。 #### 非静态成员...

    类成员函数创建线程源码

    这里的`&MyClass::threadFunction`是成员函数指针,`this`指针用于指定哪个对象的成员函数被调用。 4. **线程同步**: 当主线程需要等待线程完成时,可以使用`join`或`detach`方法。`join`会阻塞直到线程完成,而...

    深度理解c++中的this指针

    `this`指针是一个隐含的参数,它在每个非静态成员函数中都被传递,指向调用该成员函数的对象。让我们深入探讨`this`指针的各个方面。 首先,`this`指针是一个指向当前对象的指针。当创建一个类的实例时,系统会在...

    详解C++中的this指针与常对象

    首先,`this`是一个常量指针,这意味着它的指向是不可变的。在成员函数内部,`this`总是指向调用该函数的对象,尝试更改`this`的值是非法的。例如,以下代码将会出错: ```cpp void Student::changeThis(Student* ...

    详解C++编程中的静态成员与可变数据成员

    静态成员函数与普通成员函数的区别在于,它不接收隐含的`this`指针,因此不能访问非静态成员。不过,静态成员函数可以访问静态成员数据,同时也可以被类的非静态成员函数调用。在`BufferedOutput`类中,`ResetCount`...

    C++ 中的this指针详解及实例

    当成员函数的参数可变时,遵循_cdecl调用约定;当成员函数的参数固定时,这时遵循_thiscall调用约定。 最后,需要注意的是,当this指针为NULL时编译器可编译通过,例如: ```cpp class Ctest{ public: void ...

    C++课件第四章类的几个主题

    - `this`指针在调用成员函数时作为隐含参数传递,使得函数能够访问对象的数据成员。 - 成员函数可以通过`this`指针返回指向当前对象的指针或引用,例如在拷贝构造函数或赋值运算符重载中。 2. **自引用指针**: ...

    面向对象程序设计-C++-试卷分析(与“函数”相关共66张).pptx

    5. **静态成员函数**:静态成员函数属于类而不是类的任何实例,因此没有this指针,无法访问非静态成员。它们可以用来处理类的静态数据成员或执行不依赖于特定对象状态的操作。 6. **虚函数与多态性**:虚函数是C++...

    C Primer类的总结

    可变数据成员mutable允许即使是const对象也可以被修改。 构造函数是特殊的成员函数,用于创建对象实例,并且可以具有默认参数。没有默认构造函数的类需要手动定义。默认构造函数通常应被定义,特别是当类中包含必须...

    OOPC类成员PPT学习教案.pptx

    **OOPC类成员**是面向对象编程中的核心概念,主要涵盖类的组成部分,包括**成员变量**、**成员函数**、以及与之相关的特性,如**this指针**、**常量(const)**、**成员对象**和**静态成员变量与函数**。本教程将深入...

    C++实现的简单的回调函数

    这需要使用成员函数指针或`std::bind`来包装成员函数,以便在其他非成员函数中调用。例如,`std::bind(&MyClass::myMethod, this, std::placeholders::_1)`会创建一个可调用对象,当调用它时,会调用`MyClass`实例的...

    cpp代码-C++:this指针 常量指针 const int *p

    2. `const`在指针后面:`int *const p`,表示`p`是一个常量指针,其指向的地址不可变,但`p`所指的数据可变。 3. `const`在两者之间:`const int *const p`,表示`p`和`p`指向的数据都是常量,都不允许修改。 例如...

    最全面C++考前复习简略重点知识点2021.docx

    - `const int *p`表示指针可变,但指针指向的值不可变。 3. this指针: - this指针指向对象自身,非静态成员函数中隐含使用。 - 静态成员函数不具有this指针。 4. 数组名与指针的关系: - 数组名代表首元素的...

    C++经典面试题库 附带参考答案.docx

    6. this指针:成员函数通过this指针来访问对象的成员数据,this指向调用该成员函数的对象。 7. 缺省函数:C++编译器会自动生成默认构造函数、拷贝构造函数、析构函数和赋值运算符。它们分别用于对象创建、对象复制...

    关于c++的一些总结

    类的静态成员函数不与任何特定对象关联,没有`this`指针,主要用于处理静态数据成员。 12. **友元**: 友元函数或友元类可以访问另一个类的私有和保护成员,增强了代码的灵活性,但可能破坏封装性。友元可以是...

    吉林大学2002级C++面向对象程序设计试题

    7. **在静态成员函数的实现代码体内不能使用this指针,在非静态的成员函数实现代码体内可以使用this指针。** - **解析:**正确。静态成员函数没有隐含的`this`指针,因此不能直接访问对象的非静态成员;而非静态...

    自考C++试题及答案.docx

    6. this指针:`this`指针在每个对象的成员函数内部隐含存在,它指向调用该成员函数的对象。`this`确保每个对象拥有自己的数据成员,但共享处理这些数据的代码。 7. 友元关系的限制:友元关系不能提高程序的运行效率...

    c++面试题大全

    6. **this指针**:成员函数通过`this`指针来访问对象的成员数据,`this`是一个隐含的指针,指向调用该成员函数的对象。 7. **默认构造函数等四个缺省函数**:C++编译器会为每个类自动生成四种默认函数:默认构造...

    C++在成员函数中使用STL的find_if函数实例

    因为成员函数需要访问类的内部状态,所以在`find_if`中直接传递成员函数会导致编译错误,因为成员函数需要一个隐含的`this`指针来调用。为了解决这个问题,我们可以使用`std::bind1st`和`std::mem_fun`来绑定成员...

    第3次 2017310347 乔俊铭 金融实验1

    静态成员函数不具备this指针,不能访问非静态成员,但可以直接访问静态数据成员。 类的静态数据成员和静态成员函数的访问可以通过类名加上作用域解析运算符(::)进行,这使得它们可以在类对象实例化之前被调用。 ...

Global site tag (gtag.js) - Google Analytics