为什么静态成员函数后加const不能是const

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
非成员函数不能有cv 限定符,cv 限定符 c++有两个:const 和 volatile,这儿指const&&。
情况二、在C++中,静态成员函数不能有CV限定,即const和volatile限定
头文件static_cpp.h
#ifndef __STATIC_H#define __STATIC_H
class CStatic {&&& private:&&&&&&& static int static_&&& public: &&&&&&& static int get_static_value() const;&&&&&&&&& //当不是static方法时,可以用const进行限定。};
源文件staitc_cpp.cpp
#include "static_cpp.h"
int CStatic::get_static_value() const {&&&&&&& return static_}
在main.cpp中
#include "static_cpp.h"#include &iostream&
int CStatic::static_value = 1;
int main(int argc,char *argv[]){&&& cout && CStatic::get_static_value()&&&&& return 0;}
编译出现的错误:
静态成员函数,不能有CV限定符,在C++中CV限定符指const和volatile,这儿指const。
阅读(8169)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'C++编程常见错误—cannot have cv-qualifier//不能有CV限定,在C++中CV指const和volatile—1、非成员函数不能有CV限定,2、静态成员函数不能有CV限定',
blogAbstract:'
情况一、在C++中,非成员函数不能含有CV限定,即const和volatile限定
#include &iostream&
double getArea() const{&&& return 0.0;}double getVolume() const{&&& return 0.0;}
int main(int arg,char *argv[]){&&& cout && getArea() &&&&& cout && getVolume() &&&&& return 0;}
编译产生错误:',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:1,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}静态成员函数不能用const修饰 ,也不能存取nonstatic数据 - CSDN博客
静态成员函数不能用const修饰 ,也不能存取nonstatic数据
C++中静态成员函数不能用static修饰的原因:
static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。
&& 不能用const的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。
&& 什么时候使用静态数据成员和静态函数呢?
&&&&& 定义数据成员为静态变量,以表明此全局数据逻辑上属于该类。
&&&&& 定义成员函数为静态函数,以表明此全局函数逻辑上属于该类,而且该函数只对静态数据、全局数据或者参数进行操作,而不对非静态数据成员进行操作。
&& static的第一种含义:修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
&& static的第二种含义:修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
&& static的第三种含义:修饰函数时,表明该函数只在同一文件中调用。
&& static的第四种含义:修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
&& static的第五种含义:修饰类成员函数。
举个例子:
static void display(void) const
printf(&m_a1 value is %d\n&, m_a1);
// 没有const,运行OK.
// 有了const,报以下错.
// error C2272: 'display' : modifiers not allowed on static member functions
// 问题一:
// 译语个人理解是&修饰符不可用于静态成员函数&
// 但明明没有修改什么.
// 报错提示语究竟是什么意思?
static int m_a1;
int AAA::m_a1 = 100;
int _tmain(int argc, _TCHAR* argv[])
AAA::display();
}书上至少应该说过,const的这种用法(indicate&不会修改当前对象的内容),
只能用于类的一般成员函数,而不能用于静态成员函数。
静态成员函数有什么不同?根本上说,静态成员函数里面没有this指针,
就是说,相当于一个定义于该类内部的普通(非成员)函数,
这也是为什么静态成员函数不能访问成员变量的原因,
所以,静态成员函数根本不存才“改变this指向的内容”这个概念,
结论(at&last):const这个修饰符,用于静态成员函数没有意义。
因为static成员不是任何对象的组成部分,所以static成员不能被声明为const,毕竟将成员声明为const就是承诺不会修改该函数所属对象
本文已收录于以下专栏:
相关文章推荐
static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。
   不能用const的原因:
算是对《深度探索C++对象模型 h》
今天总结一下类数据成员和类成员函数在使用const定义后的处理
为了更清晰明了的引出本篇博客所要探讨的问题,还是以一段代码作为开端(一个简单的日期类)
class Date
Date(int year=1900, int month=1, i...
看到const关键字,C++程序员首先想到的可能是const常量。这可不是良好的条件反射。如果只知道用const定
义常量,那么相当于把火药仅用于制作鞭炮。const更大的魅力是它可以修饰函数的参数、...
看下面的代码和gcc给出的报错信息有助于理解非静态成员函数后面的const意思了。
非静态成员函数后面的const作用其实就是限定了函数内部不可改变数据成员的值。
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(675)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'C++静态成员函数__静态成员函数不可以调用类的非静态成员_静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存_静态成员函数不可以同时声明为 virtual、const、volatile',
blogAbstract:'\r\n1、静态成员函数不可以调用类的非静态成员,因为静态成员函数不含this指针;\r\n例如:\r\n&&&&&&&&type ClassName::getInstane()\r\n&&&&&&&& {\r\n&&&&&&&&&&&&&&&&& /*\r\n&&&&&&&&&&&&&&&&&&&&&&& 如若getInstance是静态成员函数,不通过对象\r\n&&&&&&&&&',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}为什么静态成员函数不能是const - CSDN博客
为什么静态成员函数不能是const
static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。
&& 不能用const的原因:
这是C++的规则,const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall,而类中的static函数本质上是全局函数,调用规约是__cdecl或__stdcall,不能用const来修饰它。&span style=&line-height:26px&&一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。&/span&
&& 什么时候使用静态数据成员和静态函数呢?
&&&&& 定义数据成员为静态变量,以表明此全局数据逻辑上属于该类。
&&&&& 定义成员函数为静态函数,以表明此全局函数逻辑上属于该类,而且该函数只对静态数据、全局数据或者参数进行操作,而不对非静态数据成员进行操作。
&& static的第一种含义:修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
&& static的第二种含义:修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
&& static的第三种含义:修饰函数时,表明该函数只在同一文件中调用。
&& static的第四种含义:修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
&& static的第五种含义:修饰类成员函数,如上。
本文已收录于以下专栏:
相关文章推荐
算是对《深度探索C++对象模型 h》
C++中静态成员函数不能用static修饰的原因:
static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员...
(1)CUDA与opencl:
虽然两者抱着相同的目标:通用并行计算。但是CUDA仅仅能够在NVIDIA的GPU硬件上运行,而OpenCL的目标是面向任何一种Massively Parallel...
C++ 三维数组创建的几种方法
看下面的代码和gcc给出的报错信息有助于理解非静态成员函数后面的const意思了。
非静态成员函数后面的const作用其实就是限定了函数内部不可改变数据成员的值。
为什么内联函数,构造函数,静态成员函数不能为virtual函数?
1& 内联函数
内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数。
http://nanix./_d.html
为什么内联函数,构造函数,静态成员函数不能为virtual函数?
1& 内联函数
内联函数...
原文转自:http://blog.csdn.net/ylong17/article/details/6652344
为什么内联函数,构造函数,静态成员函数不能为virtual函数
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
const成员函数表示这个成员函数不会修改对象的成员,是针对对象的。该函数含有this指针。函数调用方式为thiscall。
而static是表示不属于任何一个对象,是全局的,调用规约是__cdecl或__stdcall。
static函数不能用const修饰的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。
因为我们在定义一个类对象的时候,实际上只给该对象的非静态的数据成员分配内存空间(假设没有虚函数),而该类的静态成员数据以及该类的函数都在编译的时候分配到一个公共的空间里,所有,在定义一个对象并调用类对象的函数的时候,函数根本不知道到底是哪个对象调用了他,怎么解决这个问题呢?C++利用传递this指针的方式来实现,调用一个类对象里的函数的时候,将把这个对象的指针传递给他,以便函数对该对象的数据进行操作,对于一个定义为const的函数,传递的是const的this指针,说明不能更改对象的属性,而对static成员的函数不需传递this指针,所有就不需要用const来修饰static的成员函数了!就说const属性的作用就是对被传递的this指针加以限定,而对static成员函数的调用根本不传递this指针,所有不需const来修饰static的成员函数。从对象模型上来说,类的非static成员函数在编译的时候都会扩展加上一个this参数,const的成员函数被要求不能修改this所指向的这个对象;而static函数编译的时候并不扩充加上this参数,自然无所谓const。 因为const成员函数的const是修饰this所指之物的,也就是this将会被声明为const CLASSNAME*。而static不存在this指针,所以const对static member function的修饰是无效的。 static member怎么看都是活在CLASSNAME NAMESPACE中的普通事物。
static成员函数没有this指针,而const成员函数中的const是用来修饰this指针的。
如果一个类的成员函数是const, 你会发现在这个函数中不能调用非const成员函数(虽然这个函数可能行为上符合const函数), 因为编译器是完美主义者, 他假设非const成员函数一定会修改this中的数据, 编译时就会报错, 所以所类的const成员函数表示的意思是: 我保证不会修改this的数据, 而static成员函数是属于类共同所有的, 它没有this, 所以staic和const同时修饰成员函数是非法的
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (4301) 次

我要回帖

更多关于 const修饰函数 的文章

 

随机推荐