一、const
1.指针和const
int age = 39;
const int * pt = &age;//声明一个指向常量的指针pt
pt指向一个const int(这里是39),因此不能使用pt来修改age:
*pt = *pt+1;// wrong , 不能使用该指针(这里是pt)修改所指向对象(这里是age)的值!
cin>>*pt;//wrong,同上
注意:
- pt的声明并不意味着它指向的值就是一个常量,此处age就不是一个常量,所以可以通过age变量来修改age的值。
age = 40;//right, 此时*pt = 40
- 不能通过pt修改变量的值,但是可以将新地址赋给pt
int sage = 80;
pt = &sage;
- ① 将常规变量的地址赋给常规指针:可以,并且很常见
int a= 10;
int *b = &a;
- ②将常规变量的地址赋给const 指针:可以,如上面的age的例子
- ③将const变量的地址赋给常规指针:不可以
const int age = 39;
int * p = &age;
由于p是常规指针,可以通过*p来修改age的值,这与age是const常量矛盾。
const int months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//由const数据组成的数组
// ……
int sum( int arr[], int n); //should have been const int arr[]
// ……
int j = sum(months, 12);//wrong!months是常量地址,不能将其赋给非常量指针。
- ④将const变量的地址赋给const指针:可以,此时既不能通过指针来修改变量的值,也不能通过变量名来修改变量值。
int sloth = 3;
const int *ps = &sloth;//不能通过ps 修改sloth的值,但是可以给sloth重新赋值
int * const finger = &sloth;// finger是一个指向int的const指针,
// 可以通过finger修改sloth的值(*finger = 4)
// 但是不能把别的地址赋给finger
2.类中的const
2.1.const修饰类中的数据成员
class A
{
// ……
const int size;
// ……
};
class A
{
const int size = 100; //错误
int array[size]; //错误,未知的size
}
const数据成员的初始化只能在类的构造函数的初始化表中进行
。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现。如
class A
{
// ......
enum {size1=100, size2 = 200 };
int array1[size1];
int array2[size2];
}
枚举常量不会占用对象的存储空间,他们在编译时被全部求值。但是枚举常量的隐含数据类型是整数,其最大值有限,且不能表示浮点数。
2.2.const修饰类成员函数
class A
{
//......
void fun() const ;
};
void A::fun() const {……}
- (1)const函数(fun())可以被const对象调用,但const成员函数中不能调用非const成员函数(因为可能会改变数据成员);
- (2)const成员函数可以访问对象的const成员,别的函数不可以;
- (3)非const对象可以访问const成员函数;
- (4)一个没有被声明为const的成员函数不能被一个const对象调用.
二、static
static是C++中的关键字,可用在局部静态变量、外部静态变量/函数、静态成员变量/成员函数。
1.局部静态变量
在函数内部或者代码块内部用static修饰的变量,根据《C++三种管理数据内存方式》https://blog.csdn.net/sinat_21107433/article/details/80101909一文的知识点,在函数或者代码块内部用static修饰的变量,表明其无链接性(即该变量只在该函数或者代码块里可见,作用域为该代码块或者该函数),为静态变量,分配在静态存储区,在程序整个运行期间都不释放(即便退出该函数)。而在函数里的普通变量为自动变量(auto),保存在栈里面,随着函数结束而被释放。局部静态变量常用于计数之类的。
2.外部静态变量/函数
在函数外部(该文件的任何一个函数外部)声明定义的一个变量或者函数用static关键字修饰,就成了外部静态变量/函数,它表明该变量/函数具有内部链接性,作用域为该文件,外部文件不可以调用该变量/函数。
对比而言,在函数外部,定义普通的变量或者函数,比如在file1.cpp里定义int a,说明其有外部链接性,在别的文件file2.cpp里也可以用该变量。(此时在file2.cpp里得声明external int a)
3.静态成员变量/成员函数
类里面的静态成员变量/成员函数属于这个类,而并不属于这个类的某个具体对象,对于这个类的所有对象,都只有唯一一个该变量或者成员函数。在static修饰的成员函数里,没有this指针,因此静态成员函数只能操作类的静态成员变量,不能操作普通的成员变量,也不能调用普通成员函数。但是可以通过参数传递的方式,将this指针传递给静态成员函数。