目录
名字空间
namespace + 名字空间标识符
意义:为了程序大型化以后所有可能出现命名冲突的问题 。
导入
指定导入
using + 作用域标识符 : : 指定的变量、函数、类名
全部导入
using + namespace + 作用域标识符
作用域中的所有的变量、函数、类标识符全部导入到当前文件中。
表示从此行开始,所有的变量名用该作用域的变量。
域名访问符 (作用域访问符) : :
作用域嵌套时,可用 : : 逐级访问。
指出作用域的范围。
C与C++结构体对比
C中
结构体没有封装性,结构体中不可以直接定义函数,只能通过函数指针的方式进行回调。
C++中
结构体具有封装性,默认访问权限是公有的。
class也是由struct衍生而来的。
class访问权限默认为private私有的,而struct访问权限默认是公有的public。
struct结构体在定义对象时无需再struct修饰一次了。
struct结构中的函数,就叫成员函数。
非静态成员函数可以直接调用结构中的变量。
非静态成员函数形参列表中有一个隐藏的this指针,所以可以调用类中的成员属性。
字符串 string
name1 += name2
name1 + name2
name3 = name1 + name2
布尔变量 bool
实际是unsigned char 无符号字符整形,占一个字节,只有两个值。
bool a;
a = true;
a = false;
成员函数指针
成员函数指针定义的方式 获取成员函数指针的方式
返回值 (作用域 : : * 指针变量 ) = & 作用域 : : 成员函数名
typedef void (*Pfun)();
struct Stu
{
string name;
int age;
void showInfo()
{
cout << "姓名:" << name << ",年龄:" << age << endl;
}
};
int main()
{
void (Stu::*pfunc)() = &Stu::showInfo;
(stu.*pfunc)();
}
内联 inline
inline + 返回值 函数名(形参列表)
{
//内联函数体...
}
默认情况下,inline关键字是放在函数的定义处。
内联的作用类似于宏的展开,把函数体直接再调用处展开。
内联函数inline关键字只是一个建议作用,是否进行内联,要看具体函数代码是否精简。
如果代码逻辑复杂,或者有循环,耗时操作,递归,将自动停止内联。
内联的代价:因为会在内嵌在主函数的函数调用处展开,所以会导致最终可执行程序的代码膨胀问题。
函数重载
语法:当同一作用域下,如果有多个同名函数,且这些同名函数的行参列表中的参数类型,个数,顺序不同,他们之间形成重载关系。
与返回值是没有关系。
函数重载给我们带来好处:函数调用的灵活性,是一种静态多态。多态:函数的不同实现。
因为函数形参入栈的顺序是从右往左依次入栈的,
所以C++中冠以函数参数默认的赋值规则是:从右往左一次赋默认值,不可以跳跃。
同时,如果用分文件编程时:函数默认参数赋值可以只写在声明处,定义处无需再次进行赋值 。
当函数参数默认值与函数重载发生冲突时,一定注意函数调用的参数个数(避免两者之中的冲突时,择优而选)。
C++作用域:
全局作用域,局部作用域,命名空间作用域,类作用域(结构体作用域)。
const修饰符
C中
const 修饰的变量被称之为只读变量。
C++中
const修饰变量,如果承接是一个立即数,那么编译器会对其进程优化,优化成一个常量,如 int a = 200;
这个变量的标识符,也别称为符号常量。
volatile
const int volatile a = 100; //结果500
const int a = 100; //结果100
int* p = (int*)&a;
*p = 500;
cout << a << endl;
原因:编译器打印时,是从寄存器上取值,是编译器的优化,效率更高。
但更改内存中的值,寄存器并未改变。
volatile的作用是告诉编译器,从内存中取值。
引用 &
类型& 引用变量 = 变量
引用并没有开辟新的空间,而是已存在空间变量的别名。
所以他的作用在于函数传参及函数返回值时,可以避免值的拷贝。
1:从编译器角度来讲:
1.1:引用就是一种升级版的指针。
2:从语法形式来讲:
2.1:引用是引用的是已经存在一块合法的空间。
2.2:引用变量即是引用空间的变量的别名!!!
2.3:指针可以是一个野指针,他可以指向任何的地方。如果在C++中单纯使用指针,内存很容易被写飞。
2.4:指针可以进行无限次的赋值。
2.5:引用只可以被引用一次。
函数返回值为引用时,不仅可以避免值的拷贝,还可以做为左值使用:
左值:有地址的量就叫左值。
右值:没有地址的量叫右值,
常量:是一个右值,但常量字符串是左值。
常引用
int& b = 10; //错误
不能引用右值
const int& b = 10; //可以
const修饰的引用,也叫常引用,常引用是不可进行修改的,保证了参数的值的安全。
常引用的底层实现:(以int类型举例)
const int& b = 10;
// int temp = 10; const int& b = temp;