6.重要关键字

1.const:

1.用于声明常量,表示变量是不可以修改的;
2.const引用可以延长临时变量的声明周期,例如将函数返回值赋予一个常量引用时,该返回值的生命周期会持续到引用的作用域结束;

  • constexpr:
    1.用于指明函数/表达式/变量的值在编译时就能确定下来;
    2.用于修饰类的数据成员时,隐式声明数据成员为const;

2.volatile:

1.由于计算机有时会将变量缓存到寄存器中,而不从内存获取变量的值,有时候这可能会带来错误。
volatile将会阻止这样的优化,使得每次访问(读、写、成员调用)值时都会访问内存;
2.可以定义const volatile变量,const表明程序不能修改变量,但是外部设备可能会修改变量;
例如:只读寄存器,程序不可以写,但是CPU可能会更新其值
3. volatile用于声明函数是重写的

3.mutable:

1.用于修饰类的非静态数据成员,成员不能是引用,不能是const;
2.表明即使类对象是常量,或者通过常量引用访问该数据成员,或在const函数中访问该成员时,也可以写该成员;

  • 引用:
    1.类的非静态引用成员必须在类内给定初始值或在构造函数初始化列表中初始化,当两者都存在时,忽略前者;

4 decltype:

1.decltype得到变量或表达式的类型,但是不会计算表达式;

int a,*b=&a,&c=a;
decltype(a) d;//int
decltype((a)) e;//int& 这是一个表达式,变量被这样使用时,结果永远是引用;
decltype(*b) f;//int&,这是一个表达式,解析得到最最左值,*b指针里的值
decltype(c) g;//int&,通常情况下引用都是其所指对象的同义词,只有在decltype中例外
decltype(a+0) h; //类型为iint;

5 static:

1.可以用来声明类静态成员,==表明类成员与对象无关;静态数据成员一般需要在类外初始化,==除了下面几种情况:

  1. inline static:可以在类内初始化;
  2. const static; 可以在类内初始化;
  3. constexpr static LiteralType:必须在类内初始化;

2.可以用于函数中,声明静态局部变量,变量在第一次调用该语句时被初始化,以后再经过该语句时不再初始化;
3.用于声明静态全局变量,表示该变量只在本文件可见,即使其它文件声明了变量,链接时也无法找到;
4.用于声明静态函数,表示该函数只在本文件内可见;

6 this:

1.在类的非静态函数中,隐含了this指针,隐式声明为ClassName * const this, 因此不能对this赋值;
2.当对象时常量,或通过常引用调用函数,或函数被声明为const时,this指针被隐式声明为const ClassName * const this,因此不能修改对象成员,对于前两者,不能调用对象的非const函数
3.this是一个右值,因此不能取this的地址;

7 inline

1.inline只是建议内联,并不能保证,是否内联右编译器决定;
2.inline是在编译期实现的,因此通过高引用或指针调用的虚函数,不会发生内联的;这是因为在运行其才会知道实际调用的是哪个函数;

8 sizeof

1.sizeof(type or expr); 用于类型和表达式,
2.sizeof expression; 用于表达,但不会执行;

sizeof(2+3.14);//值为8,等价于sizeof(double),因为此表达式的结果类型为都变了;

9 pragma pack

1.其作用是改变默认的最大对齐方式,针对的是随后的struct、union、class的成员的对齐,要求指定的对齐大小必须为2的幂;

//设置新的对
#pragma pack(n)
//使用编译时通过参数给出的对齐大小;
#pragma pack()
//将当前的对齐大小入栈,也可以将指定大小的对齐方式入栈(第二种形式);
#pragma pack(push)
#pragma pack(push,n)
//将栈顶数字出栈,并将对齐大小设置为该值;
#pragma pack(pop)

10 extern

链接:是指将不同的编译单元组合为一个可执行文件的过程。其中涉及的一个问题是一个编译单元引用了其它编译单元的函数;在链接过程中就需要将这个引用修改为正确的函数地址,因此就绪呀保证连接器能够找到引用的函数;

这就需要两个编译单元使用同样的calling convention(协议),name mangling algorithm等;

name-mangling是指为了在目标文件符号表中和连接过程中使用的名字通常和编译目标文件的源程序中的名字不一样,编译器将目标源文件中的名字进行调整。
对于name mangling,c++由于支持重载,name mangling还包含了函数的参数;
由于c语言不支持重载,name mangling只是使用了函数名;
1.因此,C++和C语言混合使用时,需要使用extern "C"声明,保证能相互调用。具体包含了如下几种情况:
a. 用于C++代码中,修饰C函数声明,函数定义在C编译单元中。这使得C++编译单元可以和C编译单元链接,即在C++中可以调用C编译单元中定义的代码。如:

//C++ source code
extern "C"
{
	int open(const char* pathname,int flags);//C function declareation
}
int main()
{
	int fd =open("test.txt",0);//calls  a C function from a C++ program;
}

b. 用于C++代码中,修饰函数定义,这使得在其它C编译单元中可以调用该函数,在函数定义中可以使用C++语法、标注库等。如:

//C++ source code
//下面函数就可被c代码调用
extern "C" void handler(int) //can be called from C source code
{
std::cout<<"callback invoked\n";
}

当块中出现类成员声明和类函数成名时,即使声明了 extern “C”,仍然会被作为extern “C++”;

11 switch和go

  • 不允许出现跳过变量定义,而后面的语句仍然使用该变量的情,例如下面的go中j、switch中的i:
switch(n)
{
	case 1:
	int i=10;
	++i;
	break;
	case 2:
	i=11; //n的值为2时导致i的定义语句;不允许
	++i;
	break;
	default:
	cout<<n<<endl;
	break;
}
{
goto END;
int j=10;
END:
j+=10//提过了j的定义--->不允许
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值