C++是在C语言的基础上发展起来的,既可以进行C语言的面向程序化设计,也可以进行面向对象程序设计。
命名空间
为了应对大量变量,函数,类的名称在作用域容易发生冲突问题,提出了命名空间,namespace关键字就是用来声明命名空间的
命名空间的定义
namespace N1
{//命名空间中既可以定义变量,也可以定义函数
int m=10;
int MAX(int a,int b)
{
return a>b?a:b;
}
}
//命名空间可以嵌套定义
namespace N2
{
int m=20;
namespace N3
{
char *str="hello";
}
}
命名空间的使用
namespace N1
{
int m=10;
int MAX(int a,int b)
{
return a>b?a:b;
}
}
int usetest()
{
//在使用命名空间变量时,在变量名前加命名空间的名字如 N1::
cout << N1::m << endl;
return 0;
}
using N1::MAX
//使用using 将命名空间的变量引入
int usetest_1()
{
cout << MAX(3, 4) << endl;
}
//使用using 将整个命名空间引入
using namespace N1;
int usetest_2()
{
cout << MAX(3, 4) << endl;
}
C++的输入输出
c++能够使用c语言的标准输入输出 print及scanf,也能够使用cout控制台输入以及cin键盘输入,在使用C++的标准输入输出时必须包含头文件 iostream以及std命名空间
include<iostream>
using namespace std;
using N1::m;
int main()
{
m = 13;
int a = 0;
cin >> m >> a;
cout << m <<" "<< a << " " << 12.34 << endl;
}
输出结果
控制台输入4 12
缺省参数
在C++中定义或声明函数时,可以为函数参数直接赋值,在函数调用时如果传参就使用传递的参数,没有则使用形参中所赋的值
void fun(int a = 10)
{
cout << a << endl;
}
int main()
{
fun(5);
fun();
}
输出为
全缺省参数
全缺省参数即在函数的声明定义中对每个参数都赋有初始值,在函数调用时可以省略所有参数传递
int Add(int a=5,int b=10,int c=20)
{
return a + b+c;
}
int main()
{
cout << Add() << endl;
cout << Add(1) << endl;
cout << Add(1,2) << endl;
输出结果
在不传参数时,会使用默认值,在传一个参数是会先对第一个参数赋值,其余参数使用默认值,在传两个参数时会对前两个参数进行赋值,最后一个参数使用默认值。
半缺省参数
半缺省参数必须由右往左依次赋值
//注意:不能跳过b和c直接给a传参,也不能跳过c往a和b的形参中赋值
int Add(int a,int b=10,int c=20)
{
return a+b+c;
}
int main()
{
//因为函数传参是由左向右依次赋值的
cout << Add(1) << endl;
cout << Add(1,2) << endl;
cout << Add(1,2,3) << endl;
}
输出结果
函数重载
在c++中可以在同一作用域声明或定义函数功能相同参数不同的同名函数
int Add(int a,int b,int c)//参数个数不同,这里不要定义缺省参数
{
return a+b+c;
}
int Add(int a, int b)
{
return a + b;
}
double Add(double a, int b)//参数类型不同
{
return a + b;
}
double Add(int a, double b)//参数顺序不同
{
return a + b;
}
引用
引用类型是C++中的一个新的数据类型,不是定义一个新变量,而是已有变量的别名,与已有变量共用同一份内存空间
int a=10;
int &b=a;//引用在定义时必须进行初始化
对b进行修改a也会得到修改,根据这种特性我们可以在函数传参数时使用引用达到修改实参的目的
在C语言中我们需要通过形参改变实参的值,则在函数传递的过程中需要用到指针
例如:
swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int a=10,b=20;
swap(&a,&b);
}
//在交换函数中需要通过指针传递地址实现在函数中对实参修改的作用
在c++函数传参中使用引用类型
//将函数参数类型设为引用类型
void swap(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int left= 10,right = 20;
swap(left, right);//a是left的别名,修改a也就是修改left
cout << left<< " " << right << endl;
return 0;
}
引用和指针的区别
1.引用使用必须进行初始化;
2.引用在初始化,引用一个实体后不能改变,指针可以改变其指向对象
3.没有空引用,可以有空指针
4.在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节);
5.引用比指针使用起来相对安全;
6.引用自加为引用实体自加,指针自加则是指针偏移一个类型大小;
7.有多级指针没有多级引用;
8.指针在使用时需要解引用,引用不需要;
内联函数
以inline修饰的函数叫做内联函数,内联函数在编译器编译时会在调用函数的地方将其展开,没有函数压栈的开销,能够提高程序运行效率
inline 修饰函数只是编译器做的一个优化,在debug模式下还是会正常进行函数调用call,在release模式下会直接在调用时展开;
注意:inline的函数声明和定义不要分离,否则会链接失败。
auto关键字
auto关键字区别于c语言中的自动存储器的局部变量,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
例如:
struct stu
{
char name[20];
int age;
}stu;
int main()
{
auto b=12;//auto为int型
stu.age = 18;
strcpy(stu.name, "李华");
auto b = stu;//auto则为数组类型
cout << b.age << endl;
cout << b.name << endl;
return 0;
}
基于范围的for循环
for循环后的括号内语句由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
char str[]= "hello";
for (auto e : str)//迭代范围必须是确定的,对于数组而言就是数组的第一个元素到最后一个元素
{
cout << e << endl;
}