c++ primer 类 const
2016-05-31 20:51
369 查看
写个小程序来学习在类中有关const的用法。
1.const_stdy.h
2.const_stdy.cpp
3.main.cpp
小结:
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
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
相关文章推荐
- Android Native 绘图方法
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- C++中const的用法详细总结
- C++中const用法小结
- C++中的const和constexpr详解
- 详解C++中的const关键字及与C语言中const的区别
- C++ 中const和复合类型
- 深入了解PHP类Class的概念
- jquery 表单验证之通过 class验证表单不为空
- setAttribute 与 class冲突解决
- JavaScript通过HTML的class来获取HTML元素的方法总结
- JavaScript中的类(Class)详细介绍
- javascript面向对象包装类Class封装类库剖析
- 详解js中class的多种函数封装方法
- jQuery使用hide方法隐藏指定元素class样式用法实例
- jQuery给多个不同元素添加class样式的方法
- jQuery点击改变class并toggle及toggleClass()方法定义用法
- jquery采用oop模式class类的使用示例