C++中基于成员函数是否是const重载成员函数

C++pimer中文版第四版 378页 基于const的重载

如果我们要在一个类的成员函数中定义两个函数签名完全一样的成员函数,比如display,那么可以基于是否是const成员函数来重载。比如:

//非const对象可以使用可以使用任意成员,但是下面这个匹配的更好,所以一般用这个成员函数
Screen& display(ostream& os){
    os << "something";
    return *this;//返回的是普通引用 Screen&, this类型为Screen* const
}

//const对象只能使用下面这个const成员函数
const Screen& display(ostream& os) const{
    os << "something";
    return *this;//返回到额是const引用 const Screen&, this类型为const Screen* const
}

注意上面代码中的this指针的类型:在普通的非const成员函数中,this的类型是一个指向类类型对象的const指针,Screen* const,可以改变this所指向的值,但不能改变this所保存的地址(this的地址就是调用该函数的对象的地址,当然无法改变)。而在const成员函数中,this的类型是一个指向类类型const对象的const指针,const Screen* const,所以既不能改变this所指向对象的值,也不能改变this本身所保存的值(这点是肯定的,刚刚说过)。

由于const成员函数之所以定义成const类型,就是不想改变类对象,所以const成员函数如果返回引用类型(当然,返回非引用类型肯定没问题),只能返回const引用类型,可以返回指向类对象的引用*this,也可以返回指向成员属性的引用(这种情况在《深入探索C++对象模型》第一章有例子)。

《深入探索C++对象模型》第一章 第4页

这个例子中也存在基于成员函数是否是const的重载,两个函数签名相同的成员函数operator[]是重载关系,非const对象调用第一个成员函数,const调用第二个成员函数。

如下:

#include <iostream>
#include <cassert>
using namespace std;

template <class type, int dim>
class Point{
public:
    Point(){};
    Point(type coords[dim]){
        for(int index = 0; index < dim; ++index){
            _coords[index] = coords[index];
        }
    }

    //基于成员函数是否是const可以重载成员函数
    type& operator[](int index){
        assert(index < dim && index >= 0);
        cout << "ordinary fun." << endl;
        return _coords[index];
    }
    const type& operator[](int index) const{
        assert(index < dim && index >= 0);
        cout << "const fun." << endl;
        return _coords[index];
    }
private:
    type _coords[dim];
};

template <class type, int dim>
ostream& operator<<(ostream& os, const Point<type, dim>& pt){
    os << "(";
    for(int i = 0; i < dim - 1; ++i)
        os << pt[i] << ",";
    os << pt[dim - 1];
    os << ")";
    return os;
}

int main()
{
    int a[] = {1, 2, 3};
    Point<int, 3> point1 = Point<int, 3>(a);
    cout << point1 << endl;
    cout << point1[0] << endl;
    point1[0] = 100;
    cout << point1[0] << endl;
    return 0;
}
时间: 2024-08-03 21:58:01

C++中基于成员函数是否是const重载成员函数的相关文章

const修饰函数参数 const修饰函数返回值 const修饰成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的参数.返回值,甚至函数的定义体. const 是constant 的缩写,"恒定不变"的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:"Use const whenever you need". 1

通过函数名后加const重载的函数如何区分调用

参考网址:http://bbs.csdn.net/topics/391833689?page=1 在一般情况下默认调用不带const的函数. 想要调带const函数,解决办法: 1. 将调用发生的函数加const 2. 如果重载函数在某类内,将类实例(或this)做强制转换(const): const_cast<const A*>(this)->func();

C++的const类成员函数

转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, [cpp] view plain copy const char blank = ''; blank = '\n';  // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器

【转】C++的const类成员函数

我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数).例如, const Screen blankScreen;  //Screen为class,

static数据成员与const数据成员的定义与初始化

三种数据类型的初始化 1.static int a 的初始化 const int a 的初始化 static const int a的初始化 三种初始化方式 在类外初始化 在构造函数中通过初始化列表初始化 在声明的同时初始化 一.static数据成员 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用"类名.静态成员名"访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员函数不能访问非静态的成员..因为静态成员存在于内存,所以非

C++函数后面加const修饰

声明一个成员函数的时候用const关键字是用来说明这个函数是 "只读(read-only)"函数,也就是说明这个函数不会修改任何数据成员(object). 为了声明一个const成员函数, 把const关键字放在函数括号的后面.声明和定义的时候都应该放const关键字. 任何不会修改数据成员的函数都应该声明为const类型.如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性. #include<ios

类成员函数后边加const

本文主要整理自stackoverflow上的一个对问题Meaning of “const” last in a C++ method declaration?的回答. 测试1 对于下边的程序,关键字const的作用在哪里? 1 #include <iostream> 2 3 class MyClass 4 { 5 private: 6 int counter; 7 public: 8 void Foo() 9 { 10 std::cout << "Foo" &l

【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态

实现基类(父类)以及派生类(子类),验证继承与转换--赋值兼容规则: 子类对象可以赋值给父类对象(切割/切片) 父类对象不能赋值给子类对象 父类的指针/引用可以指向子类对象 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成) #include<iostream> using namespace std; class People    //父类或者基类 { public:     void Display()     {         cout << "_na

C++ 成员函数前和函数后加const修饰符区别

博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include<iostream> using namespace std; class TestClass { public: size_t length() const; const char* getPContent(); void setLengthValid(bool isLengthValid); pri