系列前言
本系列博文仅为博主个人学习笔记,通过博客理清学习思路用于复习。如有记述不周到的地方请谅解;如能指出,更加感谢。
解决方案语言选择C++,源文件后缀选择.cpp
c p p = c plus plus = c + +
#include<stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
上面的程序在C++的编译器里是完全可以执行的
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
结果与前一个程序一样
为了看懂这个程序引入命名空间和I/O流的概念
解决命名冲突的问题
int printf = 0;
c语言无法定义以C库函数或关键字为名字的变量
C++提供了一种解决办法——命名空间
#include<stdio.h>
#include<math.h>
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<stdio.h>
#include<math.h>
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<iostream>
using namespace std;
int main()
{
cout << "Hello world!!!" << endl;
return 0;
}
上面是我们一开始写的第一个C++程序
下面逐句分析
#include<iostream>
引出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<iostream>
using namespace std;
void f(int a = 0)
{
cout << a * a << endl;
}
int main()
{
f(2);
f();
return 0;
}
形式参数全部被初始化
传参必须是从左往右传
形式参数部分被初始化
半缺省必须是连续的从右往左缺省
传参必须是从左往右传
#include<iostream>
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<iostream>
using namespace std;
int main()
{
int a = 1;
int& ra = a;
const int& e = ra;
cout << e << endl;
return 0;
}
ra的权限是可读可写的,e的权限是只读的,由于权限是缩小了没有放大,所以这样是可以的
#include<iostream>
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引用并没有放大权限
3月22日消息 外媒 Winfuture 报道,此前微软面向 Insider 预览用户公布了 Window...
从另一台机器上复制过来的项目,由于两台机器的库目录不一致,导致了stdio.h等很...
这些日子一直在简书上使用markdown写作,已经渐渐的痴迷于这种简洁纯粹的写作方...
Go原生就支持连接数据库,所以在使用 Golang 开发时,当需要数据库交互时,即可...
本文实例讲述了正则表达式中的操作符及说明。分享给大家供大家参考,具体如下: ...
橡皮擦一个逗趣的互联网高级网虫。 观前提醒本篇文章涉及知识点巨大建议先收藏再...
1 . 目标 演示下图的git reset 各选项的效果。 2. Git Reset操作说明 图中说明:...
ajax 实现三级联动,相当于写了一个小插件,用的时候直接拿过来用就可以了,这里...
Greediness(贪婪型):最大匹配 X、X*、X+、X{n,} 是最大匹配。例如你要用 “....
2月23日消息 据外媒 Windows Latest 今日报道,借助 Windows 10 Sun Valley 更新...