系列前言
本系列博文仅为博主个人学习笔记,通过博客理清学习思路用于复习。如有记述不周到的地方请谅解;如能指出,更加感谢。
解决方案语言选择C++,源文件后缀选择.cpp
c p p = c plus plus = c + +
#include
int main()
{
printf("Hello World\n");
return 0;
}
上面的程序在C++的编译器里是完全可以执行的
#include
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
结果与前一个程序一样
为了看懂这个程序引入命名空间和I/O流的概念
解决命名冲突的问题
int printf = 0;
c语言无法定义以C库函数或关键字为名字的变量
C++提供了一种解决办法——命名空间
#include
#include
namespace ytx
{
int scanf = 0;
int printf = 0;
}
namespace hxy
{
int scanf = 1;
int printf = 1;
void f()
{
::printf("hello world\n");
}
}
int main()
{
printf("%d\n", ytx::scanf);
printf("%d\n", ytx::printf);
printf("%d\n", hxy::scanf);
printf("%d\n", hxy::printf);
hxy::f();
return 0;
}
语句模板
namespace 空间名
{
定义变量;
定义函数;
}
int main()
{
空间名::空间中定义的变量名 //引用变量
空间名::函数名(形式参数类型 形式参数名) //引用函数
}
::库函数名(::前没有东西就表示是整体空间)
#include
#include
namespace ytx
{
int scanf = 0;
int printf = 0;
namespace hxy
{
int scanf = 1;
int printf = 1;
void f()
{
::printf("hello world\n");
}
}
}
int main()
{
printf("%d\n", ytx::scanf);
printf("%d\n", ytx::printf);
ytx::hxy::f();
return 0;
}
访问语句
母空间名::子空间名::函数名/变量名
在程序中不同位置定义的同名命名空间的内容会进行合并
命名空间的使用有三种方式
空间名::函数名/变量名
using namespace 空间名;
后面调用函数和变量不在需要指定访问
缺点是失去了区分功能,命名空间暴露出来了
using 空间名::变量名/函数名
后面调用这个变量或函数的时候不需要指定访问
#include
using namespace std;
int main()
{
cout << "Hello world!!!" << endl;
return 0;
}
上面是我们一开始写的第一个C++程序
下面逐句分析
#include
引出I/O流头文件
using namespace std;
展开std空间,std是C++库的namespace,C++中的所有东西都是放到std命名空间中的东西
后面使用的cout、endl是属于std标准库中的,所以先展开std命名空间
cout << "Hello world!!!" << endl;
cout是输出的意思,表示输出流的对象,<<表示后面的语句“流向”它,endl表示换行。这句话的作用类似于printf(“Hello world!!!\n”);但是优点很明显,那就是cout语句不需要写出数据类型,系统会自动识别
int a = 1;
double b = 1.11;
cout << a << "," << b << endl;
return 0;
cin>>a>>b;
功能近似于
scanf("%d%d",&a,&b);
区别是cin也可以自动识别数据类型
初始化函数中的形式参数,如果调用函数实际参数已经给了值,那么就用不到缺省参数,如果并没有给值,缺省参数的值就是函数中形参的初始值
形象的来看,缺省参数就是一个“备胎”
#include
using namespace std;
void f(int a = 0)
{
cout << a * a << endl;
}
int main()
{
f(2);
f();
return 0;
}
形式参数部分被初始化
半缺省必须是连续的从右往左缺省
传参必须是从左往右传
#include
using namespace std;
void f(int a ,int b = 2, int c = 3 )
{
cout << a * a << " " << b * b << " " << c * c << endl;
}
int main()
{
f(2);
f(2, 4);
f(2, 4, 6);
return 0;
}
C语言中不允许函数名相同,但是C++可以
同一个函数名被多次使用就是函数重载
特点就是函数名相同,参数(类型 or 个数 or 顺序)不同
eg:
类型不同
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
long Add(long a, long b)
{
return a + b;
}
个数不同
int Add(int a, int b)
{
return a + b;
}
int Add(int a)
{
return a;
}
顺序不同
void Func1(int i, char ch)
{
}
void Func1(char ch, int i)
{
}
返回值如何与是否构成重载无关
调用时,重载函数会根据实际参数自动识别
给同一个变量取新的名字
这些名称都指向的同一块空间
对任意一个名称操作都可以操作这块共用的空间
给出语法:
变量数据类型& 新变量名 = 旧变量名;
引用取别名时,变量访问的权限可以缩小不能放大
#include
using namespace std;
int main()
{
int a = 1;
int& ra = a;
const int& e = ra;
cout << e << endl;
return 0;
}
ra的权限是可读可写的,e的权限是只读的,由于权限是缩小了没有放大,所以这样是可以的
#include
using namespace std;
int main()
{
int i = 1;
double db = i;
const double& rd = db;
const float& rs = rd;
return 0;
}
double db = i;
这句是隐式类型转换,double是临时变量,临时变量具有常性,也就是只读不可写
所以用const double引用并没有放大权限