正常来说, 在B.cpp中定义了变量int i = 0 则A.cpp中使用extern int i 使用这个变量i 但是现在的问题是 如果你在B.cpp中定义的这个变量i是const的 那么用同样的方式在A.cpp中引用这个变量 并编译的时候 g++ A.cpp B.cpp -o test 就会发现出现了未定义引用的错误
const int a = 10; const int * p = &a; *p = 20; //compile error int b = const_cast<int>(a); //compile error 在本例中出现了两个编译错误,第一个编译错误是*p因为具有常量性,其值是不能被修改的;另一处错误是const_cast强制转换对象必须为指针或引用,而例3中为一个变量,这是不允许的! [例4]const_cast关键字的使用
#include<iostream> using namespace std; int main() { const int a = 10; const int * p = &a; int *q; q = const_cast<int *>(p); *q = 20; //fine cout <<a<<" "<<*p<<" "<<*q<<endl; cout <<&a<<" "<<p<<" "<<q<<endl; return 0; } 在本例中,我们将变量a声明为常量变量,同时声明了一个const指针指向该变量(此时如果声明一个普通指针指向该常量变量的话是不允许的,Visual Studio 2010编译器会报错)。
#include<iostream> using namespace std; const int * Search(const int * a, int n, int val); int main() { int a[10] = {0,1,2,3,4,5,6,7,8,9}; int val = 5; int *p; p = const_cast<int *>(Search(a, 10, val)); if(p == NULL) cout<<"Not found the val in array a"<<endl; else cout<<"hvae found the val in array a and the val = "<<*p<<endl; return 0; } const int * Search(const int * a, int n, int val) { int i; for(i=0; i<n; i++) { if(a[i] == val) return &a[i]; } return NULL; }
#include<iostream> using namespace std; const int & Search(const int * a, int n, int val); int main() { int a[10] = {0,1,2,3,4,5,6,7,8,9}; int val = 5; int &p = const_cast<int &>(Search(a, 10, val)); if(p == NULL) cout<<"Not found the val in array a"<<endl; else cout<<"hvae found the val in array a and the val = "<<p<<endl; return 0; } const int & Search(const int * a, int n, int val) { int i; for(i=0; i<n; i++) { if(a[i] == val) return a[i]; } return NULL; } 了解了const_cast的使用场景后,可以知道使用const_cast通常是一种无奈之举,同时也建议大家在今后的C++程序设计过程中一定不要利用const_cast去掉指针或引用的常量性并且去修改原始变量的数值,这是一种非常不好的行为。
#include <iostream> using namespace std; int a = 3; int main() { constexpr int *p1 = &a; //两者等价,表示指针为常量,对象的值可以修改。 int * const p1 = &a; system("pause"); return 0; }
所以,如果想要声明一个指针常量指向一个整型常量,则可以有如下操作:
1 2 3 4 5 6 7 8 9 10 11
#include <iostream> using namespace std; int a = 3; int main() { constexpr const int *p1 = &a; //两者等价,指针为常量,指向一个整型常量 const int *const p3 = &a; system("pause"); return 0; }
constexpr指针和引用只能指向所有函数体之外的变量(全局变量)或者函数体内的静态变量。
constexpr与函数
constexpr函数
constexpr函数 可以实现编译期函数(即函数在编译期执行完毕,并在调用处进行替换): #include using namespace std; //运算n的阶乘 constexpr int factorial(int n) { return n == 0 ? 1 : n * factorial(n - 1); } int main() { cout << factorial(10) << endl; system(“pause”); return 0; } 该函数也可以在运行期执行: #include using namespace std; constexpr int factorial(int n) { return n == 0 ? 1 : n * factorial(n - 1); } int main() { int a = 3; scanf_s(“%d”, &a); cout << factorial(a) << endl; system(“pause”); return 0; } 可以对constexpr变量进行初始化: #include using namespace std; constexpr int factorial(int n) { return n == 0 ? 1 : n * factorial(n - 1); } int main() { constexpr int value = factorial(10); system(“pause”); return 0; } 规定: