为什么类的é™æ€æˆå‘˜å‡½æ•°æ²¡æœ‰â€œconst-correctnessâ€çš„概念?

时间:2012-04-11 05:58:39

标签: c++ static-members const-correctness

用例:

class A {
  static int s_common;
public:
  static int getCommon () const { s_common; };
};

通常会导致错误:

  

错误:é™æ€æˆå‘˜å‡½æ•°'static int A :: getCommon()'ä¸èƒ½æœ‰   CV-é™å®šç¬¦

这是因为const仅适用于this指å‘的对象,staticæˆå‘˜å‡½æ•°ä¸­ä¸å­˜åœ¨è¯¥å¯¹è±¡ã€‚

但如果å…许,static会员功能" const" nesså¯èƒ½å¾ˆå®¹æ˜“与staticæ•°æ®æˆå‘˜ç›¸å…³ã€‚
为什么C ++中ä¸å­˜åœ¨æ­¤åŠŸèƒ½;它背åŽçš„任何逻辑原因?

6 个答案:

答案 0 :(得分:8)

  

但是如果å…许的è¯ï¼Œé™æ€æˆå‘˜å‡½æ•°çš„“constâ€å¯èƒ½å¾ˆå®¹æ˜“与é™æ€æ•°æ®æˆå‘˜ç›¸å…³ã€‚

这是你的问题å˜å¾—困惑的地方。声明为constçš„éžé™æ€æˆå‘˜å‡½æ•°ä»ç„¶å…·æœ‰å¯¹é™æ€æ•°æ®æˆå‘˜çš„éžconst访问æƒé™ã€‚ const仅适用于this(å³ï¼šéžé™æ€æ•°æ®æˆå‘˜ï¼‰ã€‚

é™æ€æˆå‘˜å‡½æ•°åœ¨è¯­æ³•ä¸Šä»¥ç›¸åŒçš„æ–¹å¼ä½¿ç”¨const没有任何æ„义,但结果完全ä¸åŒï¼ˆå³ï¼šè®¿é—®é™æ€æ•°æ®æˆå‘˜const)。

此外,é™æ€æ•°æ®æˆå‘˜åªä¸è¿‡æ˜¯å…·æœ‰ç±»è®¿é—®æŽ§åˆ¶ï¼ˆå…¬å…±/ç§æœ‰/等)的类范围全局å˜é‡ã€‚因此,æŸäº›å‡½æ•°å¯¹å®ƒä»¬å…·æœ‰ä¸åŒçš„const访问æƒé™æ˜¯æ²¡æœ‰æ„义的,尤其是基于它们的签å。

答案 1 :(得分:7)

cv-qualifierså½±å“函数的签å。所以你å¯ä»¥ï¼š

class A {
  static int s_common;
public:
  static void getCommon () const {  };
  static void getCommon () {  };
};

现在......你怎么称呼const?没有const对象å¯ä»¥è°ƒç”¨å®ƒï¼ˆå¥½å§ï¼Œä½ å¯ä»¥åœ¨const对象上调用它,但这ä¸æ˜¯é‡ç‚¹ã€‚)

我åªæ˜¯çŒœæµ‹ï¼Œå¯èƒ½è¿˜æœ‰å…¶ä»–原因。 :)

答案 2 :(得分:5)

在æˆå‘˜å‡½æ•°ä¸Šä½¿ç”¨const cv-qualifier的基本原ç†æ˜¯ï¼š
指示传递给æˆå‘˜å‡½æ•°çš„éšè—指针this是ä¸å¯å˜çš„,并且无法修改。 staticæˆå‘˜å‡½æ•°æ²¡æœ‰éšè—çš„thiså‚数,因此constæˆå‘˜å‡½æ•°çš„static毫无æ„义。

但是如果å…许的è¯ï¼Œé™æ€æˆå‘˜å‡½æ•°çš„“constâ€å¯èƒ½å¾ˆå®¹æ˜“与é™æ€æ•°æ®æˆå‘˜ç›¸å…³ã€‚

è¿™ä¸æ˜¯å¼€å§‹ä½¿ç”¨consté™å®šè¯çš„ç†ç”±ï¼Œè¿™å¯ä»¥ä»Žä½ ä¸èƒ½å°†cv-qualifiers应用于自由函数的事实中看出æ¥ã€‚ cv-qualifiersåªç”¨äºŽthis,å³è°ƒç”¨å…¶åŠŸèƒ½çš„对象。

答案 3 :(得分:2)

ä¸æ”¹å˜ä»»ä½•å…¨å±€çŠ¶æ€çš„函数是纯粹的。 C ++ 11在特定平å°ä¸Šå¼•å…¥äº†å¯èƒ½åŒ…å«[[pure]]的属性。

const的一个问题是它是该函数的类型的一部分。将static const函数分é…给“普通â€å‡½æ•°æŒ‡é’ˆéœ€è¦ç‰¹æ®Šçš„转æ¢ï¼Œå¼ºåˆ¶è½¬æ¢æˆ–è¡°å‡è§„则。正如Luchian所æ到的,它将å…许完全模糊的é‡è½½ã€‚

基本上,您正在æ述从staticæˆå‘˜æž„建å•ä¸ªå¯¹è±¡ï¼Œå…±äº«ä¸€ä¸ªé€šç”¨çš„åˆæ ¼é—´æŽ¥è®¿é—®è·¯å¾„。为了使éžconst对象显示为const,必须通过æŸäº›ä¸œè¥¿è®¿é—®å®ƒï¼Œä½†æ˜¯æ²¡æœ‰this。它的decltype会改å˜å—?没有好的答案。如果你想è¦æ‰€æœ‰è¿™äº›ï¼Œé‚£ä¹ˆå°†å®ƒä»¬æ˜Žç¡®åœ°æ”¾åœ¨class对象中。

答案 4 :(得分:1)

我的猜测是,在æˆå‘˜å‡½æ•°ä¸Šä½¿ç”¨staticå’Œconstæ¥å¼•ç”¨é™æ€æˆå‘˜å˜é‡çš„常é‡æ ¹æœ¬å°±ä¸ä¼šè¢«è§†ä¸ºä¸€ä¸ªé€‰é¡¹ã€‚ IMO你的建议是混åˆè¿™ä¸¤ä¸ªå…³é”®è¯çš„一ç§å¥‡æ€ªçš„(但也许是明智的)方å¼ã€‚

答案 5 :(得分:1)

好问题。

我认为概念上的常é‡é€‚用于明确定义的对象或数æ®ç»“构。ä¸æ˜¯å…¨çƒ/é™æ€ç­‰ç­‰ã€‚

åŒæ ·åœ°ï¼Œæˆ‘å¯èƒ½ä¼šé—®ä¸ºä»€ä¹ˆå…¨å±€ï¼ˆæˆ–者特定于命å空间的)函数å¯èƒ½ä¸æ˜¯const,å³å®ƒå¯èƒ½æ‰¿è¯ºä¸ä¿®æ”¹ä»»ä½•å…¨å±€ï¼ˆæˆ–命å空间特定的)å˜é‡ã€‚

这并没有太多æ„义æ•æˆ‘直言。但是,是的,属于特定类的é™æ€æˆå‘˜çš„å¸¸é‡ - 这个å¯èƒ½åœ¨æŸäº›æƒ…况下有用æ•æˆ‘直言。