常成员函数

一个const对象可以调用const函数,但不能调用非const成员函数。必须将关键字const放在函数参数表之后,才能说明该函数是一个const成员函数。

声明常成员函数的格式如下:

类型标识符 函数名(参数列表) const;

定义定义如下:

类型标识符 类名::函数名(参数列表) const {//函数体}

在类中定义定义如下:

类型标识符 函数名(参数列表) const {//函数体}

在常成员函数里,不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。如果将一个对象说明为常对象,则通过该对象只能调用它的const成员函数,不能调用其他成员函数。

//error: C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改

//error: C3490: 由于正在通过常量对象访问“y”,因此无法对其进行修改

加上const属性,不可修改一般的成员变量

 void Dialog::getxy() const
{
this->x=;//error: C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改
this->y=;//error: C3490: 由于正在通过常量对象访问“y”,因此无法对其进行修改
}

常量数据成员一旦初始化以后,不会读内存,从代码区的符号表自动生成。

//error C2789: “myclass::coint”: 必须初始化常量限定类型的对象

//error C2530: “myclass::myint”: 必须初始化引用

 #include <iostream>

 class myclass
{
public:
int num;
int data;
int *p; //error C2789: “myclass::coint”: 必须初始化常量限定类型的对象
const int coint;//常量数据成员 //error C2530: “myclass::myint”: 必须初始化引用
int & myint;//引用 static int shu;//静态数据成员
public:
static void go()
{ }
void run()
{ }
myclass(int, int);//构造函数,常量限定类型的对象、引用必须重载构造函数初始化
~myclass()
{ }
}; int myclass::shu = ;//初始化静态数据成员 myclass::myclass(int a, int b) :myint(a), coint(b)//构造函数
{ } void main()
{ system("pause");
}

//引用就是共用地址,常量新开辟备份机制

//常量const在类的外部,一开始必须初始化,在代码区

//常量const在类的内部,先构建一个类的对象才能初始化,在栈或者堆

//类中的普通成员变量,类名::变量名,在栈上

//类名 *指针名=new 类名,在堆上

//类的静态成员变量,在静态区

//函数都在代码区,类的函数、静态函数都是共享的

//引用本质就是变量的别名,4个字节,本质是指针

 #include <iostream>

 class myclass
{
public:
int num;
int data;
int *p; //error C2789: “myclass::coint”: 必须初始化常量限定类型的对象
const int coint;//常量数据成员 //error C2530: “myclass::myint”: 必须初始化引用
int & myint;//引用 static int shu;//静态数据成员
public:
static void go()//静态成员函数
{ }
void run()
{ }
myclass(int, int);//构造函数,常量限定类型的对象、引用必须重载构造函数初始化
~myclass()
{ }
}; int myclass::shu = ;//初始化静态数据成员 myclass::myclass(int a, int b) :myint(a), coint(b)//构造函数
{
//引用就是共用地址,常量新开辟备份机制
//常量const在类的外部,一开始必须初始化,在代码区
//常量const在类的内部,先构建一个类的对象才能初始化,在栈或者堆
std::cout << &a << " " << &b << std::endl;
std::cout << &myint << " " << &coint << std::endl;
} //类中的普通成员变量,类名::变量名,在栈上
//类名 *指针名=new 类名,在堆上
//类的静态成员变量,在静态区
//函数都在代码区,类的函数、静态函数都是共享的 //引用本质就是变量的别名,4个字节,本质是指针 void main()
{
myclass myclass1(, );//初始化一个对象 system("pause");
}

//静态常数据成员在静态区

static const int dashu;//静态常数据成员

const int myclass::dashu = 20;//初始化静态常数据成员

 #include <iostream>

 class myclass
{
public:
int num;
int data;
int *p; //error C2789: “myclass::coint”: 必须初始化常量限定类型的对象
const int coint;//常量数据成员 //error C2530: “myclass::myint”: 必须初始化引用
int & myint;//引用 static int shu;//静态数据成员 //静态常数据成员在静态区
static const int dashu;//静态常数据成员
public:
static void go()//静态成员函数
{ }
void run()
{ }
myclass(int, int);//构造函数,常量限定类型的对象、引用必须重载构造函数初始化
~myclass()
{ }
}; int myclass::shu = ;//初始化静态数据成员
const int myclass::dashu = ;//初始化静态常数据成员 myclass::myclass(int a, int b) :myint(a), coint(b)//构造函数
{ } void main()
{ system("pause");
}

常对象

常成员函数

一个const对象可以调用const函数,但不能调用非const成员函数。

//mutable是不受const约束的类成员

//常对象不可以引用非const成员函数

//error C2662: “void area::add(int)”: 不能将“this”指针从“const area”转换为“area &”

 #include <iostream>

 class area
{
public:
int x;
int y;
mutable int z;//mutable是不受const约束的类成员
area() :x(), y()
{ }
void printxy() const//常成员函数
{
std::cout << x << " " << y << " " << z << std::endl;
}
void add(int a)//非const成员函数
{
x += a;
y += a;
}
void go()//非const成员函数
{ }
protected:
private:
}; void main()
{
const area area1;//常对象不可以引用非const成员函数 area1.printxy(); area1.add();//error C2662: “void area::add(int)”: 不能将“this”指针从“const area”转换为“area &” area1.go();//error C2662: “void area::go(void)”: 不能将“this”指针从“const area”转换为“area &” system("pause");
}

5.4const对象的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  5. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  6. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  7. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  8. ASP.NET内置对象的总结

    1. Response对象可形象的称之为响应对象,用于将数据从服务器发送回浏览器. 实例源码:链接: http://pan.baidu.com/s/1dDCKQ8x 密码: ihq0  2. Requ ...

  9. ADO.NET对象的详解

    1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...

随机推荐

  1. qt 4.6.2 vs 2005 + QCreator 开发环境配置(有注册码)

    配置开发环境可真是个痛苦的过程,网上的资料参差不齐,只有自己一步步来试验一下了 本人环境 virtualbox +  xp +  vs 2005  en 1.安装vs 2005 en sp1 下载vs ...

  2. Delph控制台(Console)程序添加图标和版权信息

    Delphi创建控制台(Console)程序默认是无法添加图标和版权的.经过仔细的对比窗体程序与控制台程序源码,发现窗体程序的工程文中,在uses结束begin开始的地方有一句如下代码:{$R *.r ...

  3. Unix/Linux环境C编程入门教程(29) 内存操作那些事儿

    函数介绍 memccpy(拷贝内存内容) 相关函数 bcopy,memcpy,memmove,strcpy,strncpy 表头文件 #include<string.h> 定义函数 voi ...

  4. EasyUI Combotree 只允许选择 叶子节点

    $("#SDID").combotree({ url: '/Ajax/GetDeptTree.aspx?level=4&pid=-1', onSelect: functio ...

  5. Node.js 参考学习地址

    前段时间研究过Node.js 自从由于笔记本硬盘崩了之后就很少在家里搞程序了,但是很想学习之,只因最近在努力学习英文.技术之外的事也需要做好,我们毕竟不是为了技术而生,技术是我们生存的一门得力技能,唯 ...

  6. 链表k个节点反向

    问题: 以k个元素为一组,反转单向链表.比如: 输入: 1->2->3->4->5->6->7->8->null and k = 3 输出:3-> ...

  7. linux之SQL语句简明教程---WHERE

    我们并不一定每一次都要将表格内的资料都完全抓出.在许多时候,我们会需要选择性地抓资料.就我们的例子来说,我们可能只要抓出营业额超过 $1,000 的资料.要做到这一点,我们就需要用到 WHERE 这个 ...

  8. vim改变多窗口的大小

    摘自:http://blog.163.com/lgh_2002/blog/static/44017526201031671927647/ vim改变多窗口的大小 VIM改变窗口大小 *window-r ...

  9. Android UI 使用HTML布局(直接打开server网页)

    非常多时候我们用HTML布局会更方便直接,记录一下. 我如今主要是直接调用server的网页(实际上是jsp的,仅仅是返回的是html).所以须要联网,第一步加入权限. <uses-permis ...

  10. GCC 命令行具体解释

    作者: www.linuxfans.org mozilla 1.gcc包括的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明确前面这半句是什么意 ...