深圳制作网站开发费用,10元微投资正规平台,新开传奇新服,年轻人适合开什么公司目录 3. C输入输出 4. 缺省(默认)参数 4.1 缺省参数概念 4.2 缺省参数分类 全缺省参数 半缺省参数 5. 函数重载 5.1 函数重载概念 6. 引用 6.1 引用概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用效率比较 6.5.1 值和引用的作为返回值类型的性能比较 6.6 引… 目录 3. C输入输出 4. 缺省(默认)参数 4.1 缺省参数概念 4.2 缺省参数分类 全缺省参数 半缺省参数 5. 函数重载 5.1 函数重载概念 6. 引用 6.1 引用概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用效率比较 6.5.1 值和引用的作为返回值类型的性能比较 6.6 引用和指针的区别 3. C输入输出
#includeiostream
using namespace std;
int main()
{cout xxxxx endl;return 0;
}
说明
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时必须包含 iostream 头文件 以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象endl是特殊的C符号表示换行输出他们都包含在包含 iostream 头文件中。
3. 是流插入运算符 是流提取运算符。
4. 使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动控制格式。 C的输入输出可以自动识别变量类型。
5. 实际上cout和cin分别是ostream和istream类型的对象和也涉及运算符重载等知识
注意早期标准库将所有功能在全局域中实现声明在.h后缀的头文件中使用时只需包含对应 头文件即可后来将其实现在std命名空间下为了和C头文件区分也为了正确使用命名空间 规定C头文件不带.h旧编译器(vc 6.0)中还支持格式后续编译器已不支持因 此推荐使用iostreamstd的方式
#include iostream
using namespace std;
int main()
{int a;double b;char c;// 可以自动识别变量的类型cina;cinbc;coutaendl;coutb cendl;return 0;
}
std命名空间的使用惯例
std是C标准库的命名空间如何展开std使用更合理呢
1. 在日常练习中建议直接using namespace std即可这样就很方便。
2. using namespace std展开标准库就全部暴露出来了如果我们定义跟库重名的类型/对 象/函数就存在冲突问题。该问题在日常练习中很少出现但是项目开发中代码较多、规模 大就很容易出现。所以建议在项目开发中使用像std::cout这样使用时指定命名空间 using std::cout展开常用的库对象/类型等方式。
4. 缺省(默认)参数
4.1 缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实 参则采用该形参的缺省值否则使用指定的实参。
void Func(int a 0)
{coutaendl;
}
int main()
{Func(); // 没有传参时使用参数的默认值Func(10); // 传参时使用指定的实参
return
4.2 缺省参数分类
全缺省参数
void Func(int a 10, int b 20, int c 30){couta aendl;coutb bendl;coutc cendl;}半缺省参数
void Func(int a, int b 10, int c 20){couta aendl;coutb bendl;coutc cendl;}
注意
1. 半缺省参数必须从右往左依次来给出不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现
//a.hvoid Func(int a 10);// a.cppvoid Func(int a 20){}// 注意如果生命与定义位置同时出现恰巧两个位置提供的值不同那编译器就无法确定到底该// 用那个缺省值。3. 缺省值必须是常量或者全局变量
4. C语言不支持编译器不支持
5. 函数重载
自然语言中一个词可以有多重含义人们可以通过上下文来判断该词真实的含义即该词被重 载了。
比如以前有一个笑话国有两个体育项目大家根本不用看也不用担心。一个是乒乓球一个 是男足。前者是“谁也赢不了”后者是“谁也赢不了”
5.1 函数重载概念
函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型 不同的问题。
#includeiostream
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{cout int Add(int left, int right) endl;return left right;
}
double Add(double left, double right)
{cout double Add(double left, double right) endl;return left right;
}
// 2、参数个数不同
void f()
{cout f() endl;
}
void f(int a)
{cout f(int a) endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{cout f(int a,char b) endl;
}
void f(char b, int a)
{cout f(char b, int a) endl;
}
int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, a);f(a, 10);return 0;
}
6. 引用
6.1 引用概念
引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空 间它和它引用的变量共用同一块内存空间。 比如李逵在家称为铁牛江湖上人称黑旋风。
类型 引用变量名(对象名) 引用实体
void TestRef()
{int a 10;int ra a;//定义引用类型printf(%p\n, a);printf(%p\n, ra);
}
注意引用类型必须和引用实体是同种类型的
6.2 引用特性
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体再不能引用其他实体‘
void TestRef()
{int a 10;// int ra; // 该条语句编译时会出错int ra a;int rra a;printf(%p %p %p\n, a, ra, rra);
}6.3 常引用
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.4 使用场景
1. 做参数
void Swap(int left, int right)
{int temp left;left right;right temp;
}2. 做返回值
int Count()
{static int n 0;n;// ...return n;
}
下面代码输出什么结果为什么
int Add(int a, int b)
{int c a b;return c;
}
int main()
{int ret Add(1, 2);Add(3, 4);cout Add(1, 2) is : ret endl;return 0;
}注意如果函数返回时出了函数作用域如果返回对象还在(还没还给系统)则可以使用 引用返回如果已经还给系统了则必须使用传值返回。
6.5 传值、传引用效率比较
以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直 接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效 率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。
#include time.h
struct A{ int a[10000]; };
void TestFunc1(A a){}
void TestFunc2(A a){}
void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 clock();for (size_t i 0; i 10000; i)TestFunc1(a);size_t end1 clock();// 以引用作为函数参数size_t begin2 clock();for (size_t i 0; i 10000; i)TestFunc2(a);size_t end2 clock();
// 分别计算两个函数运行结束后的时间cout TestFunc1(A)-time: end1 - begin1 endl;cout TestFunc2(A)-time: end2 - begin2 endl;
}
6.5.1 值和引用的作为返回值类型的性能比较
#include time.h
struct A{ int a[10000]; };
A a;
// 值返回
A TestFunc1() { return a;}
// 引用返回
A TestFunc2(){ return a;}
void TestReturnByRefOrValue()
{// 以值作为函数的返回值类型size_t begin1 clock();for (size_t i 0; i 100000; i)TestFunc1();size_t end1 clock();// 以引用作为函数的返回值类型size_t begin2 clock();for (size_t i 0; i 100000; i)TestFunc2();size_t end2 clock();// 计算两个函数运算完成之后的时间cout TestFunc1 time: end1 - begin1 endl;cout TestFunc2 time: end2 - begin2 endl;
}通过上述代码的比较发现传值和指针在作为传参以及返回值类型上效率相差很大。
6.6 引用和指针的区别
在语法概念上引用就是一个别名没有独立空间和其引用实体共用同一块空间。
int main()
{
int a 10;
int ra a;
couta aendl;
coutra raendl;
return 0;
}
在底层实现上实际是有空间的因为引用是按照指针方式来实现的。
int main()
{
int a 10;
int ra a;
ra 20;
int* pa a;
*pa 20;
return 0;
}
我们来看下引用和指针的汇编代码对比 引用和指针的不同点:
1. 引用概念上定义一个变量的别名指针存储一个变量地址。
2. 引用在定义时必须初始化指针没有要求
3. 引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何 一个同类型实体
4. 没有NULL引用但有NULL指针
5. 在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
6. 引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小
7. 有多级指针但是没有多级引用
8. 访问实体方式不同指针需要显式解引用引用编译器自己处理
9. 引用比指针使用起来相对更安全