Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;-函数头中const和static关键字之间的差异_C++_Static_Constants_Qualifiers - Fatal编程技术网

C++ c++;-函数头中const和static关键字之间的差异

C++ c++;-函数头中const和static关键字之间的差异,c++,static,constants,qualifiers,C++,Static,Constants,Qualifiers,考虑以下代码: class Test { public: //1 int kon1() const; //2 const int kon2(); //3 static int kon3(); }; 据我所知,函数1和函数2的区别在于: 函数1表示该函数将无法更改任何数据成员的值 函数2表示它将返回一个常量int (如果我有错误的理解,请纠正我) 我的问题是: 正如我们在这里看到的,如果我们想让一个函数成为const函数,const关键字就放在后面。但是为

考虑以下代码:

class Test
{
public:
   //1
   int kon1() const;

   //2
   const int kon2();

   //3
   static int kon3();
};
据我所知,函数1和函数2的区别在于:

  • 函数1表示该函数将无法更改任何数据成员的值
  • 函数2表示它将返回一个常量int
  • (如果我有错误的理解,请纠正我)

    我的问题是:
    正如我们在这里看到的,如果我们想让一个函数成为const函数,const关键字就放在后面。但是为什么在函数3,静态函数中,静态关键字放在前面?

    关键字
    静态
    不会修改变量的类型。它修改它将位于的内存地址。对于函数类型变量和数据类型变量,其使用方式相同:

    static int n;     // data
    static int n ();  // function
    
    关键字
    const
    会修改变量的类型。对于函数类型变量,该关键字有两种可能的含义:

  • 将函数的返回值修改为type
    const

    常量int n();//函数只能从非常量对象调用,并返回常量值

  • 修改调用此函数的方式

    int n()常量;//函数可以调用常量和非常量对象,并返回一个非常量值`


  • 您混合了两个概念,即存储类和存储类型

    C++有以下类型的存储类

    自动、注册、静态、外部和可变

    以及以下类型的存储类型(基于您可以在存储上执行的操作)

    只读(可初始化)-->这是常量

    读写-->这是非常量

    因此,当你定义一个变量/函数时,你必须提前告诉你想要关联的存储类型。这就是为什么在代码中把static作为第一个关键字


    希望这有帮助。

    对于
    const
    成员函数必须在之后使用
    const
    关键字,以避免返回类型的歧义

    对于
    静态
    虚拟
    和其他对函数工作方式有显著影响的关键字,最好先列出它,以便在类定义中更容易看到。例如,我们可以快速浏览成员函数列表,并找出所有
    静态
    函数或所有
    虚拟
    函数,这有助于我们了解函数的总体使用情况

    标记成员函数
    const
    (或例如
    重写
    )是一个不太重要的区别-如果您有一个非
    const
    对象,您可以调用函数,无论它们是否
    const
    ,当阅读开发者吸收函数返回类型和标识符时,适当的
    const
    -ness通常对他们来说是显而易见的,并且在一些公司/项目编码标准中,变异函数被分组在
    const
    -accessor上方,或者同一成员函数的
    const
    和非
    const
    版本并排强调它们的相似性-然后不同的
    const
    -更加突出

    所有这些因素结合起来,使C++中的实际选择成为最佳的开发,但你观察到它们有点不一致是正确的。
     int kon1() const;
    
    此函数为只读函数,仅用于常量数据

       const int kon2();
    

    此函数可以处理可修改对象,但它返回的类型为只读,调用方无法修改此类型。

    因为语言就是这样定义的吗?(具体来说,这是从C继承的。)函数1表示变量或对象的状态都不应该改变,但它可以改变可变变量的状态。您的代码回答了您自己的问题-它不能在前面,或者您无法区分返回的
    常量
    函数
    int
    和返回的非
    常量
    函数之间的区别
    const int
    。这些选择看起来真的很武断。。。e、 g.
    virtual
    在前面,而
    override
    在后面……@OliCharlesworth我知道格式已经定义好了,但我对此并不满意answer@TonyD谢谢你澄清我的理解,但我要问的是函数1、2、3之间的区别,在我的问题中是粗体的:)在第二点“只能从const对象调用函数”。我认为这可能会让人困惑,或者我的概念不清楚。我认为它可以从未声明为const的对象调用。只有它将充当const对象,因为除了可变变量外,该函数内没有成员变量可以修改。它不会“修改内存地址”。在函数中使用时,它会修改对象的生存期。在函数外部使用时,它会修改对象或函数的可见性。