C/C++C++入门
- 其他
- 2025-07-21 18:15:27

个人主页:仍有未知等待探索-CSDN博客
专题分栏:C++_仍有未知等待探索的博客-CSDN博客
目录
一、C++关键字
二、命名空间
1、区别
1. C语言
编辑 2. C++
2、命名空间定义
3、命名空间的使用
三、C++输入&输出
四、缺省参数
五、函数重载
六、引用
使用注意:
引用和指针的区别:
引用的使用:
七、内联函数
八、auto关键字(C++11)
九、基于范围的for循环(C++11)
十、指针空值---nullptr(C++11)
一、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 <iostream> namespace 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 <iostream> int main() { int a = 10; // C++没有占位符(格式输出符 : %d ···) std::cin >> a; // 输入 std::cout << a;// 输出 return 0; } 四、缺省参数说白了就是函数传参的时候,可以进行默认传值(如果没有传值的话)。
缺省参数的初始化的顺序是有要求的,必须是连续的,必须从最右侧开始读入。
#include <iostream> namespace 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 &a=b就相当于 const int * const a=b。不仅仅是a这个地址不可修改,而且其指向的内存空间也不可修改。
引用和指针的区别: 在语法层面,引用不是定义一个新的变量,而是给已有的变量去了一个别名,编译器不会为引用变量开辟空间,引用和引用的变量公用一个空间。在底层层面,引用的底层也是用指针实现的,也开辟了空间。指针是新开辟了一个空间,来专门的存变量的地址。没有空引用,但有空指针。在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小没有多级引用,有多级指针。引用不需要自己进行解引用,指针需要。引用比指针更安全(因为没有野指针,空指针的问题)。 引用的使用: 1、做参数:见下面代码。 2、做函数返回值:1)不能返回局部变量的引用。
2)不能返回函数内部new分配的内存的引用。
3)可以返回类成员的引用,但最好是const。
#include <iostream> using namespace std; // 如果是学C语言的时候,我们写交换函数是传的变量的地址,通过对变量地址的解引用来操作变量的内容。 // 现在我们可以用一个引用类型进行接收,相当于我们还是对原来的变量进行修改(可以从例子看出来,取别名可以是相同的) void swap(int&a, 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关键字(C++11)使用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循环(C++11) #include <iostream> using namespace std; int main() { int a[] = {1, 2, 3}; for (auto x : a) { cout << x << " "; } return 0; } 十、指针空值---nullptr(C++11)1、在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。
2、在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
谢谢大家!
C/C++C++入门由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C/C++C++入门”
上一篇
Ubuntu文件系统结构
下一篇
Linux底层基础知识