- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
详解 Const 的用法
Sunny.man
Const 限定符主要是声明变量为只读它的用法我归纳学习了一下,主要表现在以下几个方面。
限定符声明变量只能被读
constinti=3;
//声明 i 为一个只读变量,但 i 不是常量,而且这个变量必须被初始化,i 既然是变量而不是常量,就有办法修改这的值。
Constintn;
// errorC2734:n:constobjectmustbeinitializedifnotextern intj=0;
i=j;
// errorC3892:i:youcannotassigntoavariablethatisconst
在另一文件中引用 const 常量不可以再次附值
externconstinti; //合法
externconstintn=10; //非法,常量不可以被再次赋值
替代#define 以便于用于类型检查
用 const 方法可以使编译器对处理内容有更多了解。
#defineI=10
constlongi=10;// 用i 主要是为了给 i 分配内存空间charh=I; //没有错
charh=i; //编译警告,可能由于数的截短带来错误赋值。
由于 const 定义的是不可修改的变量,对应的一块内存地址,而不是象#define 一样定义了常量,所以,const 定义的不可改变的变
量在程序运行过程中只有一份拷贝,而#define 定义的常量在内存中有若干个拷贝。
#defineSTRINGabcdefghijklmn\n
constcharstring[]=abcdefghijklm\n; printf(STRING); //为 STRING 分配了第一次内存
printf(string); //为 string 一次分配了内存,以后不再分配printf(STRING); //为 STRING 分配了第二次内存printf(string);
修改 const 修饰的变量的值是可行的,尽管这样有违定义这个变量的初衷。
constintn=5; int*point=(int*)n;
*point=100;
常量指针和指针常量
常量指针也就是常量的指针
inta=10; intb=20;
constint*p=a;// 定义了一个指针 p 指向一个 int 型的常量变量
//intconst*p=a; 和上面的定义一样
// *p=24;//error C3892: p : you cannot assign to a variable that is const
p=b;//指针不是常量型的,可以从新指向其它的变量
intc=20; int*constp1;//errorC2734:p1:constobjectmustbeinitializedifnot
extern
int*constp2=c;// 指针是常量型的,必须被初始化,不可以再指向新的变量。
以上所说的不可以被改变,都是正规的使用时,如果使用其它手段均可以被改写,毕竟它织是一个内存块而已。
intb=10; constint*c=b;
int*e=c;// 不能用 constint* 给 int* 附值。
intb=10; int*constc=b; int*e=c;// 做右值可以
constd 在类和函数中的应用
一个函数声明中,const 可以修饰函数的返回值或参数还可以修饰是整个函数。
修饰函数参数的 const,
如 voidCopyObject(constA*a);
voidCopy(constAa);
调用函数的时候用相应的变量初始 const 实参,则在函数体中不能对传递进来的指针的内容或是引用的内容进行改变,保护了原指针或引用对象。使用指针或是引用一般用来传递一个大的对象或是结构,以用来提高效率,如果是用值传递的方式,不需要用 const 来保护。
修饰返回值的 const constAAllocObject(); constA*AllocObject();
这样声明了返回值后,const 按照修饰原则进行修饰,起到相应的保护作用。
constRationaloperator*(constRationallhs,constRationalrhs)
{
returnRational(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator());
}
返回值用 const 修饰可以防止允许这样的操作发生: Rationala,b;
Radionalc; (a*b)=c;
一般用 const 修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的时候。函数的返回值为某个对象时,如果将其
文档评论(0)