1.C++关键字
2.命名空间
在C语言中,不能解决像命名冲突这样的问题,比如定义一个变量的名字和库函数名字相同了,就会报错。而C++中提出了namespace来解决这样的问题。
2.1 命名空间定义
namespace lzb
{
// 命名空间中可以定义变量/函数/类型
int z = 10;
int Sub(int x, int y)
{
return x-y;
}
}
注意:
2.2 使用方法
命名空间有三种使用方法
//加命名空间名称及作用域限定符
int main()
{
std::cout << "hello,world" << std::endl;
return 0;
}
//使用using将命名空间中某个成员引入
using std::cout;
using std::endl;
int main()
{
cout << "hello,world" << endl;
return 0;
}
//使用using namespace 命名空间名称 引入
using namespace std;
int main()
{
cout << "hello,world" << endl;
return 0;
}
在项目中最好不要使用第三种全展开,容易命名冲突。平常写代码可以全展开。std是C++中stdio库的命名空间。
3.C++输入输出
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
int main()
{
std::cout << "hello,world" << std::endl;
return 0;
上面是C++中打印“hello,world”的方法。
4.缺省参数
缺省参数分为全缺省和半缺省。
缺省参数指在进行函数定义时,函数定义的形参可以指定默认值,在调用函数时,如果不传实参,就会使用指定的默认值赋给形参。
//全缺省
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
//半缺省
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注意:
5.函数重载
6.引用
void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%p\n", &a);
printf("%p\n", &ra);
}
6.1 特性
6.2 常引用
在一个函数传值返回的时候会生成一个对象拷贝作为函数调用的返回值。
而传引用返回是返回拷贝对象的别名,在函数栈帧结束时,系统会清理栈帧置成随机值,返回的就会是一个随机值,结果没有保障。如果出了函数作用域,返回对象就销毁了,那么就一定不能用传引用返回。传引用返回在静态变量场景下可以使用。
常引用是指如果要引用被const修饰的变量,在引用前也得加const,否则会导致权限放大。
void TestConstRef()
{
const int a = 10;
//int& ra = a; // 该语句编译时会出错,a为常量
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量
const int& b = 10;
double d = 12.34;
//int& rd = d; // 该语句编译时会出错,类型不同
const int& rd = d;
}
6.3 使用场景
//1、做参数 -- a、输出型参数 b、大对象传参,提高效率
// 2、做返回值 -- a、输出型返回对象,调用者可以修改返回对象 b、减少拷贝,提高效率
7. 引用和指针的不同点
//1.引用必须初始化,指针不必。
//2.没有NULL引用,但有NULL指针。
//3.有多级指针,没有多级引用。
//4.引用在初始化成为一个实体的别名后无法改变,指针可以改变指向任意实体。
//5.引用加1是实体加1,指针加1是地址向后+1。
//6.引用的大小是实体的类型大小,而指针的大小永远都是4或8字节(因为是地址)。
8.内联函数
内联函数里不能有函数递归,否则编译器直接跳过函数。内联函数内逻辑不能过于复杂,函数规模得足够小,编译器才会展开函数。
9.auto
auto可以自动识别变量的类型,在遍历数组时也能做到像C语言中for循环打印数组内容的作用,自动从数组中识别值,并++。
9.1 auto不能使用的场景
9.2 auto可以使用的场景
1.当变量类型名很长时可以用auto来定义变量。
2.循环遍历时可以使用auto。
#include <iostream>
int main()
{
int a[6] = { 1,2,3,4,5,6 };
for(auto e:a)
std::cout << e << " ";
return 0;
}