天天看点

【C++复习一】C++关键字

最近在复习C++,首先看的就是关键字,因为有一定基础,就直接略去熟悉的关键字了,直接看自己还不熟悉或者根本就没有用过的。

1、mutable关键字

mutable是用来突破const限制的,字面意思就是可变的,意味着即便是在一个const函数中,也是可以修改它的值的

i.e.

class A
{
public:
	inline void out() const{cout<<"output for test!";}
};
           

这个函数没有改变任何值,所以呢声明为const,但是如果现在我们有一个新的需求,希望能够计算出使用out函数的次数;首先想到的方法肯定是声明一个成员变量在out中自增。

但是函数式const的,问题就来了,该怎么办呢,其实很简单,只要将这个成员变量声明为mutable就行了

class A
{
private:
	mutable int count;
public:
	inline void out() const{cout<<"output for test!";count++;}
};
           

2、operator关键字 这个还是比较熟悉的,因为经常用,但是经常会有问题,所以也来说一下

return-type class-name::operator#(parameter-list) {
    ...
  }
  return-type operator#(parameter-list) {
    ...
  }
           

其实是用在重载操作符的,上面的语法中,#号表示被重载的操作符,加入是在类中,那么应该指定类名。一员操作符参数列表应该为空,二元的话,在operator右边的应该当做函数的参数,左边的值被当做this通过。对于不属于重载函数的operator函数,在左边的被作为第一操作数,在右边的被作为第二操作数。

3、typename关键字 这个用的还比较多的,泛型编程,写模板类或者模板函数的时候会用到,用来代替类型名或者class的

4、asm 这个就比较另类了,貌似我也没用到过,它是用来在C++程序中插入一段汇编代码的,但是各种编译器支持的格式是不太一样的。,例如

asm {
      instruction-sequence
    }
or
    asm( instruction );
           

5、extern关键字 可以置于变量和函数前,告诉编译器此变量或者函数在其他文件或者模块中定义如extern int g_int;嗨哟衶用法就是extern C fun(),告诉编译器编译时按照C的方式来编译这个函数,因为C++编译的话会把这个函数名变得面目全非,这就跟C++的重载机制有关了

6、explicit

当构造函数被指定为explicit时候,将不会把构造函数自动作为转换构造函数。。所以他是只对构造函数有用,用来抑制隐式转换。

class A
{
private:
	int count;
public:
         A(int a){count=a;}

};

void fun(A){}

int main
{
    fun(1);
}
           

这时候就会发生隐式转化,有时候我们不需要这种转会,应当在构造函数前面加上explicit关键字

explicit  A(int a){count=a;}
           

7、auto

其特点是当执行流程进入该语句块的时候执行初始化操作,仅在语句块内部使用。C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。不过所有的非全局变量的缺省假定为auto。但是在VC2010中,它有了新的含义,他可以对类型进行推断,例如

auto a=100,那么a就是int类型的。

8、namespace关键字。命名空间

这个用的比较多,有必要作个记录,防止以后忘记

部分内容参考了百度百科

// one.h
char func(char);
class String { ... };
// somelib.h
class String { ... };
           

这两个头文件是不能包含在一个程序中的,因为string会发生冲突。所谓命名空间,就是将程序库名称封装起来的技术,就好像声明了什么什么东西是我们家的一样,别人要想用必须来借。

来自百度百科的实例,基本上阐述了namespace的用法和意义。

//DISPLAY Namespace Demonstration
#include <iostream>
using namespace std;
namespace savitch1
{
void greeting( );
}
namespace savitch2
{
void greeting( );
}
void big_greeting( );
int main( )
{
{
using namespace savitch2; //使用savictch2、std、全局三个命名空间
greeting( );
}
{
using namespace savitch1; //使用savitch1、std、全局三个命名空间
greeting( );
}
big_greeting( ); //使用了std一个标准命名空间
return 0;
}
namespace savitch1
{
void greeting( )
{
cout << "Hello from namespace savitch1.\n";
}
}
namespace savitch2
{
void greeting( )
{
cout << "Greetings from namespace savitch2.\n";
}
}
void big_greeting( )
{
cout << "A Big Global Hello!\n";
}
           

继续阅读