目录
0、C++关键字
1、asm
2、catch、throw、try
3、inline
4、bool、true、false
5、*_cast
6、typeid获取类型信息
7、private、protected和public
8、typename
9、mutable
10、wchar_t
11、explicit显式调用
12、namespace命名空间定义
13、export全局引用
14、new、delete操作内置类型
15、using
16、friend 友元函数
17、class类的定义
18、operator
19、virtual虚函数
20、template函数模板
21、this指针
C++98总计有63个关键字,C语言有32个关键字
asm | do | if | return | try | continue |
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
备注:图中红色标志的是C++98中除C语言的关键字,蓝色标注的是C语言的32个关键字。C++11中有73个关键字,新增加的10个分别为:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexpect、nullptr、static_assert、thread_local。
C语言中的关键字就不多介绍了,这里主要介绍C++中的关键字。
_asm是一个语句的分隔符。不能单独出现,必须接汇编指令。一组被大括号包含的指令或一对空括号。
例:
_asm
{
mov al,2
mov dx,0xD007
out al,dx
}
//也可以在每个汇编指令前加_asm
_asm mov al,2
_asm mov dx,0xD007
_asm out al,dx
用于异常处理。try指定try块的起始,try块后的catch可以捕获异常。异常由throw抛出。throw在函数中还表示动态异常规范。
内联函数,在编译时将所调用的函数代码直接嵌入到主调函数中。各个编译器的实现方式可能不同。
bool即为布尔类型,属于基本类型中的整数类型,取值为真和假。true和false是具有布尔类型的字面量,为右值,即表示真和假。
注:字面量:用于表达源代码中一个固定值的表示法。
即 const_cast、dynamic_cast、reinterpret_cast、static_cast。
C++类型风格来性转换。const_cast删除const变量的属性,方便赋值;dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用;reinterpret_cast将一种类型转换为另一种不同的类型;static_cast用于静态转换,任何转换都可以用它,但他不能用于两个不相关的类型转换。
typeid用于获取类型信息的操作符,使用示例如下:
typeid(a).name()
基本类型对应的类型信息如下表:
基本类型 | 类型信息 |
int | i |
char | c |
short | s |
double | d |
float | f |
long | l |
返回结果为标准库种类型的引用。
C++提供private、protected和public访问修饰符,可以修饰类、函数、变量。三者对比如下:
private | 私有的,只能在本类、派生类和友元中访问 |
proteted | 保护的,只能在本类和友元中访问 |
public | 公有的,访问不受限制 |
typename关键字告诉编译器把一个特殊的名字解释为一个类型。
mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
例如:
class Person
{
private:
mutable int m_age;
public:
explicit Person(int age);
const int get_age();
};
const int Person::get_age()
{
m_age += 1; // 修改成员变量
return m_age;
}
表示字符型和宽字符型这些整数类型(属于基本类型),但一般只专用于表示字符。char(和signed char、unsigned char一起)事实上定义了字节的大小。char表示单字节字符,wchar_t表示多字节字符
explicit用于修饰单参数的构造函数,被修饰的构造函数只能被显式调用,不能被隐式调用。示例如下:
class Person
{
private:
int my_age;
public:
explicit Person(int age);
};
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。
例如:
namespace my_name
{
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
C语言有extern关键字用于声明全局变量,但是C++的模板没法用extern修饰。因此,提供export修饰在头文件声明的模板类或模板函数,其他源文件只要引用该头文件即可使用模板类或模板函数。
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
void Test()
{
// 动态申请一个int类型的空间
int* ptr1 = new int;
// 动态申请一个int类型的空间并初始化为5
int* ptr2 = new int(5);
// 动态申请10个int类型的空间
int* ptr3 = new int[10];
delete ptr1;
delete ptr2;
delete[] ptr3;
}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],注意:匹配起来使用。
(1)、在当前文件引入命名空间,例using namespace std;
(2)、在子类中使用,using声明引入基类成员名称。
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字。
说明:
(1)友元函数可访问类的私有和保护成员,但不是类的成员函数
(2)友元函数不能用const修饰
(3)友元函数可以在类定义的任何地方声明,不受类访问限定符限制
(4)一个函数可以是多个类的友元函数
(5)友元函数的调用与普通函数的调用原理相同
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
和操作符连用,指定一个重载了的操作符函数,比如,operator+。
虚函数是C++的多态机制,使用virtual关键字声明,允许通过基类指针访问基类与派生类的同名函数。基类的析构函数需要声明为虚函数,否则调用不到派生类的析构函数,导致内存泄漏。
概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。
函数模板格式:template 返回值类型 函数名(参数列表){}
template
void Swap( T& _left, T& _right)
{
T temp = _left;
_left = _right;
_right = _temp;
}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
this指针的引出:
C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编 译器自动完成。
this指针的特性:
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2. 只能在“成员函数”的内部使用。
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递 。