您的位置:首页 > 编程语言 > C语言/C++

c++ primer 类 const

2016-05-31 20:51 369 查看
写个小程序来学习在类中有关const的用法。

1.const_stdy.h

#ifndef _CONST_STDY_H_
#define _CONST_STDY_H_

#include <string>
using namespace std;

class Account{
public:
Account(string name = "xiaomi" , double rat = 0);	//const修饰成员变量只能在初始化列表中赋值

const double get_rate();						//测试非const成员函数返回const成员变量
const double get_rate() const;					//测试非const成员函数返回const成员变量

void set_rate(const double &rat);				//测试非const成员函数修改const成员变量

/*
常成员函数, 它不改变对象的成员变量.
也不能调用类中任何非const成员函数,可以调用非const成员变量
*/
string get_owner() const;						//测试const成员函数返回非const成员变量,
void set_owner(string &str ) const;				//测试const成员函数修改非const成员变量

const char *get_sex() const;
void set_sex( const char *&se) const ;			//测试const成员函数修改const成员变量

private:
string owner;
const char *sex;
double amount;
const double rate;
};

#endif


2.const_stdy.cpp

#include <iostream>
#include "const_stdy.h"
using namespace std;

Account::Account(string name /* = "xiaomi"  */, double rat):
owner(name),rate(rat),amount(0),sex("man"){

}

const double Account::get_rate(){
cout<<"in non-const fun."<<endl;
return rate;
}

/************************************************************************/
/* 为了const 对象准备的,const对象/指针/引用  只能调用类的const成员函数,

因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。                                                                   */
/************************************************************************/
const double Account::get_rate() const{
cout<<"in const fun."<<endl;
return rate;
}

void Account::set_rate(const double &rat){
//rate = rat;				//编译错误error C2166: 左值指定 const 对象
}

/*前面不加const,error1:  “return”: 无法从“const char *const ”转换为“char *”*/
const char *Account::get_sex() const{
return sex;
}

string Account::get_owner() const {
return owner;				//编译运行通过,说明const成员函数可以调用非const成员变量
}

void Account::set_sex(const char *&se) const{
//sex = se;				//编译错误,其实改变的不是sex指向的值,而是sex指针本身,如果没有const
//编译通过
}

void Account::set_owner(string &str ) const{
//owner = str;			//编译错误, 说明const成员函数不能修改非const成员变量
//get_rate();				// error C2662: “Account::get_rate”: 不能将“this”指针从“const Account”转换为“Account &”
}


3.main.cpp

#include <iostream>
#include "const_stdy.h"
using namespace std;

int main(int argc, char **argv){
Account acc;
Account *new_acc ;
const Account *con_acc ;

/* 类的普通对象,非const对象可以调用const函数*/
cout<<acc.get_rate()<<'\t'<<acc.get_owner()<<'\t'
<<acc.get_sex()<<endl;

acc.set_rate(1.2);

/* 类的指针对象 */
new_acc = new Account();

cout<<new_acc->get_rate()<<'\t'<<new_acc->get_owner()<<'\t'
<<new_acc->get_sex()<<endl;

/* 类的const指针对象 */
con_acc = new Account();

/************************************************************************/
/*  const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。
对于对象指针和对象引用也是一样。

const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任
何非const成员函数会有修改成员变量的企图。                                                                     */
/************************************************************************/

/*error C2662: “Account::get_rate”: 不能将“this”指针从“const Account”转换为“Account &”*/
cout<<con_acc->get_rate()<<'\t'<<con_acc->get_owner()<<'\t'
<<con_acc->get_sex()<<endl;

system( "pause" );
return 0;
}

小结:

1.我们首先看类的对象:const对象和非const对象。

a.如果是非const对象,由上面的实验可以看出:非const对象可以访问非const成员函数,const成员函数

b.若是const对象:.只能访问const成员函数, 不能访问非成员函数。

2.然后再看成员函数:

a.非const成员函数可以访问非const数据成员、const数据成员, const成员函数 ,非const成员函数 。但不能修改const数据成员 , 可以修改非修改const数据成员。

b.const成员函数可以访问非const数据成员、const数据成员 ,const成员函数,但不能访问非const成员函数 。不能修改const数据成员和非const数据成员,。

3.作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。

另外有两篇文章说的比较好:
http://blog.csdn.net/eric_jo/article/details/4138548 和 http://www.cnblogs.com/jiabei521/p/3335676.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ primer class const