重生之我要学C++第一天

简介: 重生之我要学C++第一天

我重生了,今天开始带着上世纪的回忆重新学习C++


命名空间(namespace)

新定义命名空间是C++为防止对变量,函数,类命名冲突而提出的新的解决措施。是在全局作用域之外的自己定义的属于命名空间自己的 特定域范围。每一个域范围互不干扰,界限分明。使用时可以避免命名冲突

1. #include<iostream>
2. using namespace std;
3. namespace myspace
4. {
5. int a=20;//这个a在命名空间中
6. void func()//这个函数在命名空间中
7.     {
8.         cout<<"is my func"<<endl;
9.     }
10. }
11. int a=10;//这个a在全局作用域中
12. void func()//此函数在全局作用域中
13. {
14.     cout<<"is your func"<<endl;
15. }
16. int main()
17. {
18.     cout<<a<<endl;
19. func();
20. return 0;
21. }

上图的输出结果是

由此我们可以看出:全局作用域和命名空间互不干扰,界限分明。默认使用的是全局作用域的变量、函数、类。

那么如何使用命名空间内的变量、函数、类?

命名空间的使用分为三种:1.命名空间全部展开        2.命名空间部分展开        3.指定使用

下面依次说明:

命名空间的全部展开:是直接将命名空间内的变量、函数、类展开到全局作用域范围,使得全局范围的代码可以直接使用命名空间内定义的内容。但是这种方式比较危险,容易和原全局作用域范围内的变量、函数、类名相同,造成矛盾。

1. #include<iostream>
2. using namespace std;
3. namespace myspace
4. {
5. int a = 20;//这个a在命名空间中
6. void func()//这个函数在命名空间中
7.     {
8.         cout << "is my func" << endl;
9.     }
10. }
11. using namespace myspace;//全部展开方式:using+namespace+命名空间名
12. int main()
13. {
14.     cout << a << endl;//使用的是命名空间的变量和函数
15. func();
16. return 0;
17. }

冲突: 如果全局作用域内和命名空间内有相同的变量、函数、类名就不能直接全部展开,否则会出现名字相同的矛盾。

命名空间的部分展开:命名空间的部分展开是将命名空间内的某个变量、函数、类暴露到全局作用域范围。从而使用命名空间。

1. #include<iostream>
2. using namespace std;
3. namespace myspace
4. {
5. int a = 20;//这个a在命名空间中
6. void func()//这个函数在命名空间中
7.     {
8.         cout << "is my func" << endl;
9.     }
10. }
11. using myspace::a;//部分展开规则:using+命名空间名+::+要使用的变量或函数或类
12. int main()
13. {
14.     cout << a << endl;//这里只能访问到a,不能访问到func()
15. return 0;
16. }

命名空间的指定使用:命名空间的指定使用是不展开命名空间内的任何变量、函数、类。在要使用的地方直接指定使用,要在每一个使用的地方指定。这种方法最繁琐,但是却最安全,没有重名的隐患。

1. #include<iostream>
2. using namespace std;
3. namespace myspace
4. {
5. int a = 20;//这个a在命名空间中
6. void func()//这个函数在命名空间中
7.     {
8.         cout << "is my func" << endl;
9.     }
10. }
11. int main()
12. {
13.     cout << myspace::a << endl;//指定使用规则:指定的命名空间名+::+变量或函数或类
14.     myspace::func();
15. return 0;
16. }

命名空间的自动合并

在两个不同文件的两个命名空间,或者同一文件的两个命名空间,如果这两个命名空间的名字相同,命名空间内部将会自动合并。

例如,在一个最简单的C++程序中,

1. #include<iostream>
2. #include<stdlib.h>
3. using namespace std;//合并后共有的std标准命名空间全部展开
4. int main()
5. {
6.     cout<<"hello world"<<endl;
7. return 0;
8. }

这里包含了两个头文件,但是他们内部都共有std这个标准命名空间。他们两个各自的std命名空间就会合并为一个共有的命名空间std。

如何合理应用std?

日常练习中,直接using namespace std将标准命名空间全部展开即可。但是在大型项目中,要谨慎展开,防止std中的名字与项目内的其他全局变量、函数、类名相同。

输入输出流

这里只介绍最基本的C++输入输出

1. #include<iostream>
2. using namespace std;
3. int main()
4. {
5.  int a = 0;
6.  char ch;
7.  cout << "请输入a" << endl;
8.  cin >> a;
9.  cout<< "请输入ch" << endl;
10.   cin >> ch;
11.   cout << "a=" <<a << endl;
12.   cout << "ch=" << ch << endl;
13. 
14.   return 0;
15. }

说明:

1. 使用cout标准输出对象(console out控制台输出)cin标准输入对象(console in控制台输入)时,必须包含< iostream >头文件,以及按命名空间使用方法使用std(标准命名空间)。

2. coutcin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<

iostream >头文件中。

3. <<是流插入运算符,>>是流提取运算符

4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。

C++的输入输出可以自动识别变量类型。

5. 实际上coutcin分别是ostreamistream类型的对象,>><<也涉及运算符重载等知识

缺省参数(默认参数)

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实

参则采用该形参的缺省值,否则使用指定的实参。如下

1. #include<iostream>
2. using namespace std;
3. void func(int x=2)
4. {
5.     cout<<x<<endl;
6. }
7. int main()
8. {
9. func();//没有指定实参,使用缺省值2
10. func(1);//指定实参则使用指定实参
11. return 0;
12. }

全缺省与半缺省

全缺省:函数参数全部为缺省参数。半缺省:函数部分参数为缺省参数。

注意:

1. 半缺省参数必须从右往左依次来给出,不能间隔着给。

1. void Func(int a, int b = 10, int c = 20)
2.  {
3.      cout<<"a = "<<a<<endl;
4.      cout<<"b = "<<b<<endl;
5.      cout<<"c = "<<c<<endl;
6.  }

2. 缺省参数不能在函数声明和定义中同时出现。声明给,定义就不能给。

1. #include<iostream>
2. using namespace std;
3. void func(int x = 2);//函数声明已给缺省参数
4. void func(int x)//函数定义,这里不可以是缺省参数(int x=2)
5. {
6.     cout << x << endl;
7. }
8. int main()
9. {
10. func();
11. func(1);
12. return 0;
13. }

函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这

些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型

不同的问题。

1.参数个数不同:

1. #include<iostream>
2. using namespace std;
3. void func()
4. {
5.     cout << "null" << endl;
6. }
7. void func(int x)
8. {
9.     cout << x << endl;
10. }
11. int main()
12. {
13. func();//调用无参func
14. func(1);//调用有参func
15. return 0;
16. }

2.参数类型不同

1. #include<iostream>
2. using namespace std;
3. void swap(int* a,int* b)
4. {
5. int tmp = *a;
6.     *a = *b;
7.     *b = tmp;
8. }
9. void swap(char* a, char* b)
10. {
11. char tmp = *a;
12.     *a = *b;
13.     *b = tmp;
14. }
15. int main()
16. {
17. int a = 2, b = 3;
18. char c = 'j', d = 'k';
19. swap(a, b);//调用int,int的swap
20. swap(c, d);//调用char,char的swap
21.     cout << "a=" << a << " "<< "b=" << b << endl;
22.     cout << "c=" << c <<" " << "d=" << d << endl;
23. return 0;
24. }

3.类型顺序不同

1. #include<iostream>
2. using namespace std;
3. void f(int a, char b)
4. {
5.  cout << "f(int a,char b)" << endl;
6. }
7. void f(char b, int a)
8. {
9.  cout << "f(char b, int a)" << endl;
10. }
11. int main()
12. {
13.   f(2, 'a');//调用int char的f函数
14.   f('a', 2);//调用char int的f函数
15.   return 0;
16. }

相关文章
|
存储 编译器 C语言
重生之我要学C++第三天(类和对象)
重生之我要学C++第三天(类和对象)
120 0
|
程序员 C语言 C++
重生之我要学C++第六天(const,static,友元)
重生之我要学C++第六天(const,static,友元)
174 0
|
程序员 C++
重生之我要学C++第五天(下)
重生之我要学C++第五天(下)
135 0
|
编译器 C++
重生之我要学C++第五天(上)
重生之我要学C++第五天(上)
161 0
|
编译器 C语言 C++
重生之我要学C++第四天
重生之我要学C++第四天
145 0
|
编译器 程序员 C语言
重生之我要学C++第二天
重生之我要学C++第二天
160 0
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
80 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
158 0
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
159 12