建站 wordpress,重庆城乡规划和建设局网站,网上购物商城网站建设,淘宝客做网站自动更新个人主页#xff1a;仍有未知等待探索-CSDN博客 专题分栏#xff1a;C_仍有未知等待探索的博客-CSDN博客 目录 一、C关键字
二、命名空间
1、区别
1. C语言
编辑 2. C
2、命名空间定义 3、命名空间的使用
三、C输入输出
四、缺省参数
五、函数重载
六、引用 … 个人主页仍有未知等待探索-CSDN博客 专题分栏C_仍有未知等待探索的博客-CSDN博客 目录 一、C关键字
二、命名空间
1、区别
1. C语言
编辑 2. C
2、命名空间定义 3、命名空间的使用
三、C输入输出
四、缺省参数
五、函数重载
六、引用
使用注意
引用和指针的区别 引用的使用
七、内联函数
八、auto关键字(C11)
九、基于范围的for循环(C11)
十、指针空值---nullptr(C11) 一、C关键字
下列的关键字有的我们在C语言中就已经见过了而有些比较陌生不过不用慌这些现在不用死记以后多用就记住了。 二、命名空间
在C/C中变量函数和类的名称都存在于全局作用域中而C为了避免这样的命名冲突和名字污染添加了命名空间域。关键字namespace
全局作用域和命名空间域就类似于这样如果理解不对请指教相当于单独开了一个空间给命名空间域。 1、区别
1. C语言
在没有命名空间的C语言语法里这样写就是错误的报错信息可以看见rand重定义。 2. C
定义了一个命名空间在命名空间里面定义了一个rand变量这样的话就不会和库函数里面的rand函数产生命名冲突。:: 这个符号作用域限定符 2、命名空间定义
#include iostream// 正常定义
namespace cpp1
{int a 1;int b 2;int Add(int a, int b){return a b;}
}
// 嵌套定义
namespace cpp2
{int a 1;int b 2;int Add(int a, int b){return a b;}namespace cpp3{int a 1;int b 2;int Add(int a, int b){return a b;}}
}// 一个工程里面允许定义多个相同的命名空间——编译器最后会合成同一个命名空间中。int main()
{// 打印cpp2里面的函数printf(%d\n, cpp2::Add(1, 2));// 打印cpp2里面的cpp3里面的函数printf(%d\n, cpp2::cpp3::Add(3, 4));return 0;
} 3、命名空间的使用
#include iostreamnamespace cpp
{int a 1;int b 2;int Add(int a, int b){return a b;}
}
// 将该命名空间进行展开
// using namespace cpp;// 将命名空间域里面的变量或者函数进行个别展开
using cpp::a;
int main()
{// 用命名空间名称 作用域作用符// printf(%d\n, cpp::Add(1, 2));// 用using 命名空间名称将该命名空间进行展开// using namespace cpp;// 将命名空间域里面的变量或者函数进行个别展开// std::cout a std::endl;// 该语句有错误————变量b未定义// std::cout b std::endl;return 0;
}
三、C输入输出
// 如果是自己做题 可以将std这个命名空间域进行展开 using namespace std;// 如果是写工程的话不建议展开
#include iostreamint main()
{int a 10;// C没有占位符格式输出符 %d ···std::cin a; // 输入std::cout a;// 输出return 0;
}
四、缺省参数
说白了就是函数传参的时候可以进行默认传值如果没有传值的话。
缺省参数的初始化的顺序是有要求的必须是连续的必须从最右侧开始读入。
#include iostreamnamespace C
{// C语言写法int Add(int a, int b){return a b;}
}namespace Cpp
{// C缺省参数写法int Add(int a 5, int b 0){return a b;}// 也可以只缺省一个参数数目没有要求int sub(int a, int b 2){return a * b;}
}int main()
{// endl 的作用是 插入一个换行符并且刷新输出流std::cout C::Add(1, 2) std::endl; std::cout Cpp::Add(1, 2) std::endl;std::cout Cpp::Add(1) std::endl;std::cout Cpp::Add() std::endl;std::cout Cpp::Add(1) std::endl;return 0;
}
五、函数重载
函数重载的意义是允许有多个功能类似的同名函数的存在。就比如说实现一个加法函数可以有整型的加法函数也可以有浮点型的加法函数等等实现的都是加法的功能如果要用函数名进行区别的话比较不友好
要求函数的参数类型、参数类型顺序、个数不完全一样。
六、引用
引用就相当于是给一个变量起了一个别名。
用值作为参数进行传递形参会形成一份临时拷贝效率低下。建议用引用作为形参的类型 使用注意 1用引用的时候必须进行初始化。 2引用类型必须和引用实体的类型一样。 3变量引用完之后不能进行修改。 int a 10;
int b 4;
int c a;
// 不允许对c进行修改指向的操作
// c b; 4一个变量可以多次进行引用。 5常引用const int ab就相当于 const int * const ab。不仅仅是a这个地址不可修改而且其指向的内存空间也不可修改。 引用和指针的区别 在语法层面引用不是定义一个新的变量而是给已有的变量去了一个别名编译器不会为引用变量开辟空间引用和引用的变量公用一个空间。在底层层面引用的底层也是用指针实现的也开辟了空间。指针是新开辟了一个空间来专门的存变量的地址。没有空引用但有空指针。在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32 位平台下占4个字节)引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小没有多级引用有多级指针。引用不需要自己进行解引用指针需要。引用比指针更安全因为没有野指针空指针的问题。 引用的使用 1、做参数见下面代码。 2、做函数返回值 1不能返回局部变量的引用。 2不能返回函数内部new分配的内存的引用。 3可以返回类成员的引用但最好是const。 #include iostream
using namespace std;// 如果是学C语言的时候我们写交换函数是传的变量的地址通过对变量地址的解引用来操作变量的内容。
// 现在我们可以用一个引用类型进行接收相当于我们还是对原来的变量进行修改可以从例子看出来取别名可以是相同的
void swap(inta, int b)
{a a ^ b;b a ^ b;a a ^ b;
}int main()
{int a 5, b 6;swap(a, b);cout a b;return 0;
}
#include iostream
using namespace std;int main()
{int a 10;int b a;b 3;cout a;return 0;
}
七、内联函数 1、如果内联函数的代码量比较大的时候不建议用内联函数 2、inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址 了链接就会找不到。 内联函数其实对标的就是C语言中的宏函数。
如果让你写一个宏函数的话可能会漏洞百出比较的麻烦。
// 写一个加法的宏函数// 错误写法一
#define Add(a, b) a b// 错误写法二
#define Add(a, b) a b;// 错误写法三
#define Add(a, b) (a b)// 正确写法
#define Add(a, b) ((a) (b))
而为了解决这样的问题C引入了一个内联函数的语法和宏函数一样在编译时编译器会在调用的地方进行展开。
#include iostream
using namespace std;// 内联函数在函数的基础上加上一个inline的关键字。
inline int Add(int a, int b)
{return a b;
}int main()
{cout Add(1, 2);return 0;
} 八、auto关键字(C11) 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编 译期会将auto替换为变量实际的类型。 auto不能用来推导数组的类型。 // auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须加
// 在同一行定义多个变量当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量
int main()
{int x 10;auto a x;auto* b x;auto c x;cout typeid(a).name() endl;cout typeid(b).name() endl;cout typeid(c).name() endl;*a 20;*b 30;c 40;return 0;
}
九、基于范围的for循环(C11)
#include iostream
using namespace std;int main()
{int a[] {1, 2, 3};for (auto x : a){cout x ;}return 0;
}
十、指针空值---nullptr(C11) 1、在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入 的。 2、在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 3. 为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。 谢谢大家