目录
任何一门语言的学习都是从屏幕上输出“hello world”起步的。
#include <iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
一、命名空间
在进行较大的工程时,通常会把任务分给几个小组,每个小组负责自己模块的代码。而在各个小组完成自己的代码后,进行合并时,很容易遇到一个问题,就是变量名、函数名冲突等。为了让这些变量只作用在自己的代码中,就产生了命名空间——namespace。
可以使用关键字namespace来创建命名空间
#include <iostream>
using namespace std;
namespace box
{
int a = 10;
double b = 22.22;
}
int main()
{
cout << a << endl;
return 0;
}
封在命名空间中的变量,直接使用的话是找不到的
这时就需要用到 :: ——域作用限定符(左边是空白默认是全局域)
#include <iostream>
using namespace std;
namespace box
{
int a = 10;
double b = 22.22;
}
int main()
{
cout << box::a << endl;
return 0;
}
不同的域可以定义同名的变量
(注意:C语言没有域作用限定符,C++才有)
命名空间不影响变量的生命周期,只是限定域,编译的查找规则(默认先在局部找,再去全局找,不会去命名空间里去找),如果有限定域,则只去限定域中查找。
命名空间中还可以定义函数、类型、新的命名空间等。
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合并到同一个命名空间中。例如在包含的头文件iostream中,里面有一个std的命名空间。并且不止是这个头文件,C++的头文件中都有一个std的命名空间,在包含多个头文件时,编译器会将这些都叫std的命名空间合并成一个。
命名空间中的内容有三种访问方式:
1、命名空间好比给里面的内容建立起围墙,通过域作用限定符才可以访问。
2、using namespace std,会把std这个命名空间中的内容释放出来,好比把围墙拆了,可以直接使用。
3、指定展开。比如会经常使用到cout,using std::cout;
二、C++输入输出
cout——console output——控制台输出,<< 流插入运算符;
cin——console input——控制台输入,>> 流提取运算符;
特点是可以自动识别类型。
三、缺省参数
函数在声明或定义时为函数的参数指定一个缺省值,在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
全缺省参数
#include <iostream>
using std::cout;
using std::cin;
void f(int a = 1, int b = 2, int c = 3)
{
cout << a + b + c << '\n';
}
int main()
{
f(); //1 + 2 + 3 = 6
f(10); //10 + 2 + 3 = 15
f(10, 20);//10 + 20 + 3 = 33
return 0;
}
半缺省参数(只能从右往左连续缺省)
#include <iostream>
using std::cout;
using std::cin;
void f(int a, int b = 2, int c = 3)
{
cout << a + b + c << '\n';
}
int main()
{
f(10); //10 + 2 + 3 = 15
f(10, 20);//10 + 20 + 3 = 33
return 0;
}
注意:缺省参数不能在函数声明和定义中同时出现,一般在声明当中给出。
四、函数重载
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同。
#include <iostream>
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void swap(double* a, double* b)
{
double temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int i = 10, j = 20;
printf("i = %d, j = %d\n", i, j);
swap(&i, &j);
printf("i = %d, j = %d\n", i, j);
double x = 33.33, y = 66.6;
printf("x = %lf, y = %lf\n", x, y);
swap(&x, &y);
printf("x = %lf, y = %lf\n", x, y);
return 0;
}
注意:返回值不同,不构成重载,原因是调用时的二义性,无法区分,调用时不指定返回值类型。
五、引用
就是取别名,类型+&就是引用。如下,ra前面是int+&,表示ra是一个引用,它是a的另一个名字。同理sa也是a的另一个名字,x是sa的另一个名字,也就同样是a的另一个名字。对这些引用进行操作就是对a进行操作。
#include <iostream>
using std::cout;
using std::endl;
int main()
{
int a = 10;
int& ra = a;
int& sa = a;
int& x = sa;
cout << a << endl;
++a;
cout << a << endl;
++ra;
cout << a << endl;
++sa;
cout << a << endl;
++x;
cout << a << endl;
}
#include <iostream>
using std::cout;
using std::endl;
void swap(int& ra, int& rb)
{
int temp = ra;
ra = rb;
rb = temp;
}
int main()
{
int a = 10, b = 20;
swap(a, b);
cout << a << " " << b << endl;
return 0;
}
注意:
1、引用必须初始化。
2、引用的指向不能更改。
3、引用可以作为函数的返回值传递。