1、typeid()
运行时获知变量类型名称,可以使用 typeid(变量).name()
2、引用
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。,如下所示,声明了一个变量a为1,再声明一个a的引用b,此时对b做任何修改,a也会发生相同的变化。
int a = 1;
int &b = a;
b = 3;
// 此时a和都是3
// 指针
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
// 引用
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
引用的规则:
- 引用被创建的同时必须被初始化,例如 int &a; 就是非法的。
- 无NULL引用,引用必须与合法的存储单元关联。
- 一旦引用被初始化,就不能改变引用的关系。
类别 | 创建时是否要初始 | 值是否可变 | 能否为NULL | 其他 |
---|---|---|---|---|
指针 | 可以不初始化 | 可变 | 可以 | 有指针的指针 |
引用 | 必须初始化 | 一旦初始化,不可变 | 不可以 | 无引用的引用 |
3、C与C++风格的头文件
C的头文件带.h,如:
include <stdio.h> // 输入/输出函数
include <string.h> // 字符串处理
include <stdlib.h> // 内存分配等
C++的头文件带.h,如:
include <iostresm> // 数据流输入输出
include <string> // 字符串类
include <queue> // STL队列容器
4、命名空间
随着可重用代码的增多,各种不同的代码体系中的标识符之间同名的情况就会显著增多。命名空间的作用是为了解决日益严重的名称冲突问题。
#include<iostream>
using namespace std; //使用std名字空间下的所有变量
int a = 100;
namespace A
{
int a = 1;
int b = 2;
namespace B //名字空间的嵌套
{
int c = 3;
int d = 4;
}
namespace B //可以重复定义命名空间,相当于扩充
{
int e = 5;
}
//namespace E; //错误,不能嵌套声明
}
namespace B
{
int a = 1;
int b = 2;
//匿名的名字空间
namespace
{
int c = 3;
}
}
int main()
{
cout << a << endl;
cout << A::a<< endl;
cout << A::b << endl;
cout << A::B::c << endl;
cout << A::B::d << endl;
cout << B::a << endl;
cout << B::b << endl;
//使用A命名空间下,B命名空间的所有变量
using namespace A::B;
cout << c << endl;//可直接使用,无需前缀
cout << d << endl;
cout << e << endl;
//如果不加using namespace std,必须加前缀std::cout
std::cout << "hello!" << endl;
//命名空间 A::B 的别名other_name
namespace other_name = A::B;
cout << other_name::e << endl;
//使用匿名的名字空间的变量
cout << B::c << endl;
return 0;
}
5、inline
使用inline关键字,目的是为了提高函数的执行效率,用关键字inline放在函数定义(放在声明前面无效)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开。
inline int max(int a, int b)
{
return a > b ? a : b;
}
在调用 max 函数时,就会直接用函数体来替代。
注:应该禁止滥用内联函数,它是以代码膨胀的代价减少函数调用的开销,只有函数体短小简单,才可以让目标代码执行更加高效。
6、C++的类与结构体的区别
类别 | 默认访问级别 | 继承访问级别 |
---|---|---|
类 | 成员变量及成员函数的默认访问级别为private | 默认是public |
结构体 | 成员变量及成员函数的默认访问级别为public | 默认是private |