C/C++中Static和Const的作用
C/C++中Static和Const的作用
(一)const用于定义常量和修饰变量
TYPE const ValueName = value; //TYPE表示数据类型int、long、float等
const TYPE ValueName = value; //TYPE表示数据类型int、long、float等
1、const char *p 表示指针p指向的内容不能改变
2、char * const p,就是将P声明为常指针,它的地址不能改变。
3、这种const指针是前两种的结合,使得指向的内容和地址都不能发生变化.
const double pi = 3.14159;//pi是常数
const double *const pi_ptr = π
(二)const修饰函数形式参数
(1)传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void function(const int Var);
(2)参数指针所指的内容为常量不可变
void function(const char* Var);
(3)参数指针本身为常量不可变(也无意义,因为char* Var也是形参)
void function(char* const Var);
(4)参数为引用,为了增加效率同时防止修改。修饰引用参数时:
void function(const Class& Var); //引用参数在函数内不可以改变
void function(const TYPE& Var); //引用参数在函数内为常量不可变
当输入参数为用户自定义类型和抽象数据类型时,将“值传递”改为“const&传递”可以提高效率,可以比较如下的代码:
void fun(A a);
void fun(A const& a);
第一个函数效率较低,函数体内产生A类型的临时对象用于“值传递”参数a,而临时对象的构造、复制、析构过程都需要消耗资源和时间的,但使用第二种方式,按“引用传递”不需要产生临时对象,省了临时对象的构造、复制、析构的过程,因此效率较高。而之所以用const修饰a,是为了保证引用a不被修改。
const char *GetChar(void){};
char*ch=GetChar();//错误,按指针返回时,该函数返回值只能被赋值给const修饰的同类型指针
const char *ch=GetChar();//正确
(2)函数按值返回,函数会把返回值赋给外部临时变量,用const无意义!不管是内部还是非内部数据类型。
int const get(){return this->n;}
int temp=i.get();//正确,按值传递时,接受返回值有无const均可
(3)函数采用引用方式返回的场合不多,只出现在类的赋值函数中,目的是为了实现链式表达。
(三)const修饰类的成员函数(函数定义体):
class stack
{
public:int GetCount(void) const ;
private:int m_num;
};
int stack::GetCount(void) const
{m_num++;
}
编译器输出错误信息:error C2166: l-value specifies const object。
B.(*pp)++
C.(**pp) = \\c\\;
D.以上都不对
正确答案: A
【详细解释】:const 限定一个对象为只读属性。
char const *ptr:若const限定符在*之前,则const限定的是*ptr。也就是说,ptr可以改变其所指向的对象,但不能通过该指针修改其所指向对象的值。
若const限定符在*之后,则const限定的是ptr而不限定*ptr。也就是说,ptr不可以改变其所指向的对象,但能通过该指针修改其所指向对象的值。 若在*之前有const限定符且在*之后也有const限定符,则ptr与*ptr都被限定。也就是说,ptr既不可以改变其所指向的对象,也不能通过该指针修改其所指向对象的值。先从一级指针说起吧:
(1)const char p //限定变量p为只读。这样如p=2这样的赋值操作就是错误的。
(2)const char *p //p为一个指向char类型的指针,const只限定p指向的对象为只读。这样,p=&a或 p++等操作都是合法的,但如*p=4这样的操作就错了,因为企图改写这个已经被限定为只读属性的对象。 (const 限定*p,即限定p指向的内容)
(3)char *const p 限定此指针为只读,这样p=&a或 p++等操作都是不合法的。而*p=3这样的操作合法,因为并没有限定其最终对象为只读。 (const直接与p结合,因此这里只限定了指针本身p,但内容可以修改 )
(4)const char *const p 两者皆限定为只读,不能改写。 (结合方向:const char *(const p))
有了以上的对比,再来看二级指针问题:
(1)const char **p p为一个指向指针的指针,const限定其最终对象为只读,显然这最终对象也是为char类型的变量。故像**p=3这样的赋值是错误的,而像*p=? p++这样的操作合法。
(2)const char * const *p 限定最终对象和 p指向的指针为只读。这样 *p=?的操作也是错的。
(3)const char * const * const p 全部限定为只读,都不可以改写。
C/C++中Static和Const的作用相关推荐
- 理解PHP5中static和const关键字
PHP5中加入了很多面向对象的思想,PHP5的面向对象比较接近Java的面向对象思想.我们这里对PHP5中的static和const关键字作用进行一下描述,希望对学习PHP5的朋友有帮助. (1) s ...
- 类中static、const、readonly、partial修饰符
static 修饰类成员: static在C#中的用法与C++类似,当声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个静态成员的副本,static变量可在成员函数或类的定义外部进行 ...
- Java中static修饰符的作用
近日在做网络通信服务器和客户端的Java语言开发,碰到了获取客户端长连接Channel对象,利用唯一对象Client的获取方法getSingleClientInstance(),以为可以得到,但是显示 ...
- C++中static与const成员
一.static成员 (1)static数据成员 static数据成员的创建是为了对象之间的共享和沟通,具有以下特点: 1.1 static数据成员属于类,只占一份空间(不像普通数据成员每个对象中都有 ...
- Java中static关键字的作用与用法
一.static关键字的特点: static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能. 1. static修饰成员方法 static修饰的方法一般 ...
- c语言中{的作用,C语言中Static和Const关键字的作用
C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...
- C C++中关于全局变量静态变量,extern,static,const的区别与总结
一.extern 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也 ...
- 关键字static、const、volatile的作用
关键字static的作用是什么?这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1.在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2. 在模 ...
- IOS 本地推送 IOS10.0以上 static的作用 const的作用
//需要在AppDelegate里面启动APP的函数 加上 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNot ...
最新文章
- python数据分析及展示(一)
- typedef VS #define —— C语言中的 关键字 与 C指令
- tcpdump 识别成dns_1.6.3 使用tcpdump观察DNS通信过程
- 构建ASP.NET网站十大必备工具
- Sqlite3 数据库基本操作
- 适配iOS10以及Xcode8
- python操作Access .mdb数据库环境配置
- 【线段树求逆序数】【HDU1394】Minimum Inversion Number
- 物联网智能家居与射频识别技术应用
- 班德瑞1-9,神秘园1-4全集下载
- 【Laravel系列4.4】模型Eloquent ORM的使用(二)
- 文远知行杯广东工业大学第十六届程序设计竞赛 E爬塔
- 微信小程序别踩白方块(有效果图)
- 中国人的英文名和外国人的中文名
- PS中的画笔工具和修饰模式(画笔模式)
- 深度学习基础:2.最小二乘法
- 决定高薪的细节守则 zz
- mdb java_java从mdb文件中读出数据
- 一言 源码 android,Android - 一言的简单实现
- ZT android -- 蓝牙 bluetooth (四)OPP文件传输