2021-05-22
Posted 超级无敌陈大佬的跟班
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-05-22相关的知识,希望对你有一定的参考价值。
1、auto关键字:
- auto自动推断变量类型
1)auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。auto的自动类型推断发生在编译期。
2)用auto定义变量时必须对其进行初始化;在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
3)auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
- auto用作for循环迭代:
vector<int> v_case(10, 1);
for(auto item : v_case){
cout << item << endl;
}
2、static关键字:
- 1.静态局部变量:
①存储位置:存储在全局数据区.(普通局部变量在栈区分配内存)
②初始化:首次执行到变量的定义处时进行初始化,默认值为0;以后不管再调用函数多少次,执行到此定义处都不会再进行初始化。(普通局部变量每次调用函数时都会被初始化)
③作用域:静态局部变量的作用域仍然只是在函数内部,但它的数据内存不会在函数结束时立即释放,会保存到程序运行结束。(普通局部变量在栈区,函数结束后会立即释放内存)。
- 1.静态全局变量
①作用域:只能在当前源文件中使用,不能被其它源文件使用。(普通全局变量可以被其它源文件使用)
- 2.静态函数:
①作用域:静态函数不能被其它源文件使用;其它源文件中可以定义相同的函数名,不会造成重定义冲突。
- 3.类的静态成员变量
1)静态成员是属于整个类,而不属于某个实例对象,因此也只有一个地址保存一份数据存放于数据区。
2)静态成员变量在类中只是声明,并不是定义,因此不分配内存,对类用sizeof求大小也不会将static变量的大小算进去。
3)静态成员变量必须在类的外部定义(定义后才会分配唯一的内存),如果定义时不赋值,则默认初始化为0。
4)public的静态数据成员既可以通过类名引用,也可以通过对象名引用;private静态成员只能通过对象名调用。
- 4.类的静态成员函数
1)只能调用本类的静态成员变量或静态成员函数,不能调用本类的非静态成员的函数和变量。
原因:非静态成员变量/函数在类成员函数中被调用时,形参会指向当前实例对象的this指针来调用,然而静态成员函数没有这个this指针。
2)
- static深入特性
1)头文件中声明static变量,当多个cpp包含该头文件时,每个cpp文件中static变量是独立的,互不影响。
2)static成员变量必须在类外定义,因为静态成员属于整个类,而不属于某个对象,如果在类内定义静态成员,会导致每个对象都包含该静态成员,这是互相矛盾的。
class A {
static int count ; // 类内声明
};
// 类外定义并初始化,不必再加static关键字
int A::count = 0 ;
3)静态成员函数与非静态成员函数的区别
静态成员函数不存在this指针,不能访问非静态成员变量。
4)为什么要用得静态成员变量和静态成员函数
为了实现共享。因为静态成员函数和静态成员变量属于类,不属于类的实体,这样可以被多个对象所共享。
5)静态成员函数的优点
静态成员函数主要为了调用方便,不需要生成对象就能调用。
申明和定义的区别:
- 变量的申明与定义
1)定义:用于为变量分配存储空间,还可为变量指定初始值。变量只能有一个定义。
2)申明:用于向程序表明变量的类型和名字,不需要分配存储空间的,只是告诉编译器变量已经在别处定义过了。
3)除非有extern关键字,否则都是变量的定义;当使用extern时也进行了赋值操作,则依然会被认为是定义。
int a; //定义,分配内存,未赋初始值。
int b = 10; //定义,分配内存并赋值
extern int c; //声明
extern int d = 10; //定义,虽然有申明关键字,但赋值了,所有也会变成定义
- 函数的申明与定义
1)函数的定义和声明也是一样,定义需要分配存储空间;声明只是告诉编译器这个函数已经在别处定义过了。
2)函数的定义和声明比较好区分。有函数体的即为定义,不带函数体即为声明。
///==没有函数体(即{}),为函数申明
int add(int a);
///==有函数体,则是函数声明
int add(int a){
return a;
}
以上是关于2021-05-22的主要内容,如果未能解决你的问题,请参考以下文章