如何在C++头文件中定义const成员变量?

------------------------------------------------------------------------------------

一、必须在构造函数中初始化const成员变量。

[email protected]:~/project/test/const-test/const4_cpp$

[email protected]:~/project/test/const-test/const4_cpp$ cat const.h -n

1  #ifndef CONST_H

2  #define CONST_H

3

4  #include<iostream>

5  using std::cout;

6  using std::endl;

7

8  class TestType{

9      const int m_const;

10  public:

11      TestType(int dat = 0) {}

12      void Show()const{

13          cout << "this=" << this << ", ";

14          cout << "m_const:(" << &m_const << ", " << m_const << ")\n";

15      }

16  };

17

18  #endif // #ifndef CONST_H

[email protected]:~/project/test/const-test/const4_cpp$ cat main.cpp -n

1  #include "const.h"

2

3  int main(){

4      cout << __func__ << endl;

5      TestType obj(4);

6      obj.Show();

7  }

[email protected]:~/project/test/const-test/const4_cpp$ g++ main.cpp

In file included from main.cpp:1:0:

const.h: In constructor ‘TestType::TestType(int)’:

const.h:11:5: error: uninitialized member ‘TestType::m_const’ with ‘const’ type ‘const int’ [-fpermissive]

TestType(int dat = 0) {}

^

------------------------------------------------------------------------------------

二、不能在构造函数体中初始化const成员变量。

[email protected]:~/project/test/const-test/const4_cpp$ cat const.h  -n

1  #ifndef CONST_H

2  #define CONST_H

3

4  #include<iostream>

5  using std::cout;

6  using std::endl;

7

8  class TestType{

9      const int m_const;

10  public:

11      TestType(int dat = 0) { m_const = dat; }

12      void Show()const{

13          cout << "this=" << this << ", ";

14          cout << "m_const:(" << &m_const << ", " << m_const << ")\n";

15      }

16  };

17

18  #endif // #ifndef CONST_H

[email protected]:~/project/test/const-test/const4_cpp$ cat main.cpp -n

1  #include "const.h"

2

3  int main(){

4      cout << __func__ << endl;

5      TestType obj(4);

6      obj.Show();

7  }

[email protected]:~/project/test/const-test/const4_cpp$ g++ main.cpp

In file included from main.cpp:1:0:

const.h: In constructor ‘TestType::TestType(int)’:

const.h:11:5: error: uninitialized member ‘TestType::m_const’ with ‘const’ type ‘const int’ [-fpermissive]

TestType(int dat = 0) { m_const = dat; }

^

const.h:11:37: error: assignment of read-only member ‘TestType::m_const’

TestType(int dat = 0) { m_const = dat; }

^

[email protected]:~/project/test/const-test/const4_cpp$

------------------------------------------------------------------------------------

三、只能在构造函数初始化列表中初始化const成员变量。每个对象都有一个m_const。

[email protected]:~/project/test/const-test/const4_cpp$ cat const.h -n

1  #ifndef CONST_H

2  #define CONST_H

3

4  #include<iostream>

5  using std::cout;

6  using std::endl;

7

8  class TestType{

9      const int m_const;

10  public:

11      TestType(int dat = 0) : m_const(dat) {}

12      void Show()const{

13          cout << "this=" << this << ", ";

14          cout << "m_const:(" << &m_const << ", " << m_const << ")\n";

15      }

16  };

17

18  #endif // #ifndef CONST_H

[email protected]:~/project/test/const-test/const4_cpp$ cat main.cpp -n

1  #include "const.h"

2

3  int main(){

4      cout << __func__ << endl;

5      TestType obj(4);

6      obj.Show();

7  }

[email protected]:~/project/test/const-test/const4_cpp$ g++ main.cpp

[email protected]:~/project/test/const-test/const4_cpp$ ./a.out

main

this=0x7fff7ab7d960, m_const:(0x7fff7ab7d960, 4)

[email protected]:~/project/test/const-test/const4_cpp$

------------------------------------------------------------------------------------

时间: 2024-10-09 18:13:31

如何在C++头文件中定义const成员变量?的相关文章

关于在头文件中定义变量的问题

如果在一个头文件中定义了一个变量 A.h: int i; 在A.cpp,B.cpp...文件中包含了这个头文件,编译时就会产生重复定义的错误.问题所在是因为int i;这句代码是定义了一个i变量,包含一次头文件就定义了一次i,包含多次肯定引起错误.如果改成extern int i;这句代码就变成了一个声明了.并不会定义i这个变量.不过在多个cpp文件里初始化一样会出现错误.只能在一个cpp文件中进行初始化.

解决头文件中定义全局变量MSVC、GNU编译器出现重定义问题

有时候我们经常碰到这样的事情,想定义某个类的静态成员,在头文件中定义该成员或者全局变量,头文件又同时被多个文件引用到,链接的时候则会出现,重定义,但是又不想在cpp文件中定义,现有一种方法可以解决此问题,直接上代码 #if defined(_MSC_VER ) __declspec(selectany) #elif defined(__GNUC__) __attribute__((weak)) #else #error "unknown complier" #endif int a=1

头文件中不可以放变量的定义

注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件 要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量, C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次. 不过有三个例外,一下三中实体的定义也可放到头文件中 1.值在编译时就已知的const 变量的定义可以放到头文件中 如:const int num(10); 2.类的定义可以放到头文件中 3.inline 函数 4.C++11的新特性 conste

c语言头文件中定义全局变量的问题

问题是这么开始的: 最近在看一个PHP的扩展源码,编译的时候的遇到一个问题: ld: 1 duplicate symbol for architecture x86_64 仔细看了一下源码,发现在头文件中 出现了全局变量的定义. 简化一下后,可以这么理解: // t1.h #ifndef T1_H #define T1_H int a = 0; #endif //------------------ //t1.c #include "t1.h" #include "t2.h&

C语言头文件中定义全局变量导致重复定义错误

合作方升级SDK后,程序编译出现变量重复定义的错误,通过错误提示无法找到什么位置重复定义了,但确定是引入新SDK后才出现的错误,从SDK的头文件中查找,最终发现在头文件中定义了全局变量 我们的项目在多个头文件中include了SDK的头文件,所以相当于这个全局变量在多个头文件中定义了,因此报错. 总结:头文件不要有任何全局变量的定义出现

能不能在头文件中定义全局变量?(转)

地址:https://blog.csdn.net/baidu_35679960/article/details/79200865 1.ANSI C标准是什么?GNU又是什么?ld是什么? ANSI C是C语言的标准规范,是国际标准化组织制定的国际标准. 虽然 ANSI C规范了C语言的实现,但是在实际情况中,各家C语言提供商都会根据平台的不同情况对ANSI C进行一定的扩展.因此可以将现实中C语言实现看作是ANSI C的一个超集.比较有代表性的例子是linux的gcc编译器.由于该编译器对ANS

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

在C的头文件中定义的结构体,如何在cpp文件中引用

解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dialog3.h" #include <QDebug> extern "C" { typedef struct PRINT { unsigned char Parameters;//BitDepthAC,BitDepthDC,q unsigned char PlaneCo

c语言头文件中定义变量

最近在看一个PHP的扩展源码,编译的时候的遇到一个问题: ld: 1 duplicate symbol for architecture x86_64 仔细看了一下源码,发现在头文件中 出现了全局变量的定义 ZEND_DECLARE_MODULE_GLOBALS(xx) 简单开来,可以这么理解 // t1.h #ifndef T1_H #define T1_H int a = 0; #endif //------------------ //t1.c #include "t1.h" #