`
killvin
  • 浏览: 46231 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

[转载] static 和 const的解释(二)

 
阅读更多

http://bbs.chinaunix.net/viewthread.php?tid=143183

 

static 和 const的解释

QUOTE:
原帖由 "yuxq" 发表:
...
5. const 限定类的成员函数:

class classname {
 public:
  int fun() const;
 .....
}

  注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中均要使用const,因为const已经成为类型信息的一部分。

获得能力:可以操作常量对象。

失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。



楼主的这篇文章值得仔细阅读。但是,我觉得上述“const 限定类的成员函数”这一部分写得比较简略,特别是其中“注意”后面的文字,更是使人不知所云,所以想对这一部分做一些补充说明。

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。除此之外,在类的成员函数后面加 const 还有什么好处呢?楼主告诉我们的:“获得能力:可以操作常量对象”,其实应该是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。正如非const类型的数据可以给const类型的变量赋值一样,反之则不成立。

请看下面一个完整的例子,然后我再作一些说明。
#include <iostream>;
#include <string>;
using namespace std;

class Student {
public:
Student() {}
Student( const string& nm, int sc = 0 )
: name( nm ), score( sc ) {}

void set_student( const string& nm, int sc = 0 )
{
name = nm;
score = sc;
}

const string& get_name() const
{
return name;
}

int get_score() const
{
return score;
}

private:
string name;
int score;
};

// output student's name and score
void output_student( const Student& student )
{
cout << student.get_name() << "\t";
cout << student.get_score() << endl;
}

int main()
{
Student stu( "Wang", 85 );
output_student( stu );
}
复制代码


设计了一个类 Student,数据成员有 name 和 score,有两个构造函数,有一个设置成员数据函数 set_student(),各有一个取得 name 和 score 的函数 get_name() 和 get_score()。请注意 get_name() 和 get_score() 后面都加了 const,而 set_student() 后面没有(也不能有const)。

首先说一点题外话,为什么 get_name() 前面也加 const。如果没有前后两个 const 的话,get_name() 返回的是对私有数据成员 name 的引用,所以通过这个引用可以改变私有成员 name 的值,如
Student stu( "Wang", 85 );
stu.get_name() = "Li";
复制代码

即把 name 由原来的 "Wang" 变成了 "Li",而这不是我们希望的发生的。所以在 get_name() 前面加 const 避免这种情况的发生。

那么,get_name() 和 get_score() 这两个后面应该加 const的成员函数,如果没有 const 修饰的话可不可以呢?回答是可以!但是这样做的代价是:const对象将不能再调用这两个非const成员函数了。如
const string& get_name(); // 这两个函数都应该设成 const 型
int get_score();
void output_student( const Student& student )
{
cout << student.get_name() << "\t"; // 如果 get_name() 和 get_score() 是非const成员函数,这一句和下一句调用是错误的
cout << student.get_score() << endl;
}
复制代码

由于参数student表示的是一个对const Student型对象的引用,所以 student 不能调用非const成员函数如 set_student()。如果 get_name() 和 get_score() 成员函数也变成非const型,那么上面的 student.get_name() 和 student.get_score() 的使用就是非法的,这样就会给我们处理问题造成困难。

因此,我们没有理由反对使用const,该加const时就应该加上const,这样使成员函数除了非const的对象之外,const对象也能够调用它。

分享到:
评论

相关推荐

    类的static,const,static const,const static成员的初始化

    下面我们将对这四种成员变量的初始化方式进行总结和解释。 1. 类里的 const 成员初始化 在一个类里,const 成员变量不能在类定义中赋初值,因为编译器不知道 const 的内容是什么,所以不能把它用作编译期间的常量...

    static和const用法详解

    Static和Const用的详解 static和const是C语言中两个非常重要的关键字,它们在程序设计中扮演着不同的角色。本文将详细介绍static和const的用法和特性。 static static是C语言中的一个存储类型限定符,主要用来...

    const与static用法完整总结

    `const`和`static`都是C++中非常重要的关键字,合理使用它们可以增加代码的安全性和效率。`const`用于标记不可变的数据或行为,而`static`则用于表示全局或静态作用域的数据或函数。正确理解并掌握它们的使用方法...

    浅谈C++中的几个关键字static,const,inline.doc

    static、const 和 inline 是 C++ 中非常重要的关键字,它们在程序设计中扮演着非常重要的角色。 static 关键字的详细解释: static 关键字可以控制变量的存储方式和可见性。控制存储方式是指将变量存储在程序的...

    c和c++中static,const的一些见解

    在C和C++编程语言中,`static`和`const`是两个非常重要的关键字,它们在不同的上下文中有各自的用途和含义。这篇文章将深入探讨这两个关键字,并分享一些专家的见解。 首先,`static`关键字在C和C++中的主要作用有...

    static,const,volatile用法

    ### static、const、volatile用法解析 在编程领域中,`static...总结来说,`static`、`const`、`volatile` 这三个关键字各自有着独特的功能和用途。正确理解和运用这些关键字可以帮助我们编写出更安全、更高效的代码。

    extern,static以及const修饰变量的不同用法

    在C语言中,`extern`、`static` 和 `const` 是三个非常重要的关键字,它们在定义变量时起到不同的作用。本文将深入探讨这三个关键字分别在定义全局变量和局部变量时的不同用法及其效果。 #### 二、全局变量的修饰 ...

    const,extern,static,volatile的使用

    ### const、extern、static、volatile ...通过以上的介绍可以看出,`const`、`extern`、`static` 和 `volatile` 这四个关键字在 C 和 C++ 中有着广泛的应用。正确地使用这些关键字可以极大地提高代码的质量和可维护性。

    const extern static volatile 小结

    了解 `const`、`extern`、`static` 和 `volatile` 的基本概念后,在实际编程过程中可以根据需求灵活运用它们: - **安全性**:通过 `const` 确保某些数据不被意外修改,提高代码的稳定性。 - **内存管理**:利用 `...

    C++类中的static和const用法实例教程

    static和const是C++程序设计中非常重要的概念,本文实例列举了C++类中的static和const的规则和用法。供大家参考借鉴。具体说明如下: 首先以代码用来举例说明。示例代码如下: class A { public: A():m(10) //...

    理解PHP5中static和const关键字的区别

    在PHP5中,面向对象编程得到了显著增强,引入了`static`和`const`这两个关键字,它们分别用于处理静态成员变量和常量。下面将详细解释这两个关键字的作用和使用场景。 1. `static`关键字 `static`关键字用于声明类...

    php中static和const关键字用法分析

    在设计面向对象的程序时,合理使用static和const可以帮助我们更好地管理资源和常量。静态成员适用于那些不需要与类的任何特定实例关联的场景,如缓存数据、计数器等;而常量适用于定义那些在程序中不会改变的值,如...

    易语言常量支持库const.fne const_static.lib v1.6#8版(静态版)

    "易语言常量支持库const.fne const_static.lib v1.6#8版(静态版)"是专为易语言设计的一个扩展库,它提供了丰富的常量支持,增强易语言在编写程序时的表达能力和效率。 常量在编程中扮演着重要的角色,它们是不可...

    全局变量、extern、static、const区别与联系.doc

    C++知识点: 全局变量、extern、static、const区别与联系.doc

    C/C++中static,const,inline三种关键字详细总结

    一、关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。 static 的两大作用: 一、控制存储方式 static...

    extern、static修饰变量的使用及define和const区别

    extern、static修饰变量的使用及define和const区别可结合博客http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2faiyang10%2farticle%2fdetails%2f49448591理解

    C++编程const与static

    徐彤老师耗时三年倾心制作,专业录制,通俗想,细致的讲解了C++ 编程从入门到高级

    C语言中auto,register,static,const,volatile的区别

    ### C语言中auto,register,static,const,volatile的区别 #### 1. auto `auto`关键字在C语言中主要用于声明变量,并且默认情况下所有局部变量(非静态局部变量)都具有`auto`属性。这意味着当函数执行时,这些...

    volatile关键字 Const关键字 static关键字 mutable 关键字

    在C/C++编程语言中,`volatile`, `const`, `static` 和 `mutable` 是四个非常重要的关键字,它们各自有着独特的用途和含义。下面将详细解释这些关键字的作用以及它们在程序设计中的应用。 1. `volatile` 关键字 `...

Global site tag (gtag.js) - Google Analytics