C++修饰符

主要的修饰符:signed、unsigned、long、short、const、static、extern、auto、register、mutable、thread_local、volatile、restrict。
Ps:只了解一些常用的。

unsigned 表示变量内存的所有位都表示变量的数值,也就是说变量值恒为正。
signed 变量内存的第一位表示变量的正负,也就是说变量值可正可负。

longshort修饰基本数据类型后,打印typeid(T).name()和sizeof(T),‘–’表示不可修饰。

数据类型 short long 无修饰
bool 1个字节
char/wchar_t 1个字节/2个字节
int short,2个字节 long,4个字节 4个字节
float double,8个字节 4个字节
double long double,8个字节 8个字节
void

const

表示变量内存只可读,不可写。
很多人把const修饰的变量读作常量,其实是不准确的。存储在常量存储区的量才叫常量(布尔常量、字符常量、整数常量、浮点常量、字符串常量、#define定义的量)!而const修饰的变量只能叫做只读量,而且const根本不会影响变量的存储分区。

但这样写代码是可行的-_-

const int size = 10;
char array[size] = { 1, 2, 3, 4 ,5 ,6, 7 };

老大难的问题!
const修饰指针
int a = 1;
const int* i = &a; //不能通过 *i 改变a的值,但可以修改指针 i 指向的地址。技巧:不看int,就成了cosnt *i,*i是a的值,即不能改变a的值。
int * const i = &a; //指针 i 只能指向a的地址,同时,可以通过 *i 改变a的值;不看int,就成了const i,i是指针。

const修饰类的成员函数
void fun() const
fun函数不能修改成员变量;不能引用非const成员函数,即使引用的这个函数不修改成员变量。
const int* fun()
返回值必须赋给 const int* 类型。所以,不能修改指针指向的值。
const int fun()
返回值可以赋给int类型。所以,加不加const无区别。

static

被static修饰的变量叫做静态变量,它有以下几个作用。
1、改变变量的存储区为静态存储区,也就是说变量的内存在程序启动时被申请,程序结束时被释放。虽然变量存储区变了,但作用域没变!
2、修饰全局变量时,将变量的作用域限制在声明这个变量的文本内。避免了在多个文件中定义同名全局变量,编译器会错:找到一个或多个重定义的符号。(同名,又都是全局作用域,会违背同一变量只能被定义一次的原则。限制作用域后,即使同名,也不算是同一变量啦。)
3、修饰类的成员变量时,其实只是在类中声明这个变量,定义还是在类外的。市面上说的,针对类而非对象什么的,实际上基础还是静态变量的特性,只是恰恰这个静态变量在类中声明了。

extern

告诉编译器,这里只是声明,定义在其他文本中。
这样就避免编译器把这行代码看成定义,然后编译报错:找到一个或多个重定义的符号。程序启动时,会为全局变量申请内存,并与变量名关联起来。只要通过变量名就可以访问那段内存了。

auto

C++ 11:声明变量时,根据初始化表达式自动推断该变量的类型;声明函数时,函数返回值的占位符;
C++98:表示变量拥有自动的生命周期,这是多余的,在C++11中已删除这一用法。

你可能感兴趣的:(02,C++,修饰符,const,static,extern,C++)