时隔三月,继C语言之后,博主学成C++归来,欲重开博客,与诸位分享经验,共同学习,今天就开始我们的c++第一课——入门篇。
既然要开始学习c++,就要了解
什么是c++:
c++的发展历史:
关于更多的关于c++的历史,大家可以搜索贝尔实验室或者点击这个链接
关于学习c++的重要性
可谓经典永不过时,排名不能说明那个语言好,那个不好,每门编程语言都有适应自己的应用场景。
c++在工作领域的应用
本节知识点安排目的
等。熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标:
1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用
域方面、IO方面、函数方面、指针方面、宏方面等。
2. 为后续类和对象学习打基础
命名空间
c++的发明一开始其实是为了补C语言的坑,所以C语言的很多问题在这里都被解决了,比如大家看这个代码
这是一个很简单的输出代码,我们定义了一个全局变量rand=0,且输出了它。
那么在这个代码的基础上进行一个小改动
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main()
{
printf("%d", rand);
return 0;
}
加了一个新的头文件,大家猜猜还可不可以运行输出
很遗憾,他报了一个错误,说rand重定义了 ,明明我们只定义了一个rand,这是C语言的经典问题,因为头文件stdlib.h里包含一个函数rand,编译器无法识别,判定为重定义,所以c++完美解决了这个问题,来看看c++是怎么解决的:
C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
命名空间定义
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
// sc是命名空间的名字,一般开发中是用项目名字做命名空间名。
// 我用的是sc,大家下去以后自己练习用自己名字缩写即可,如张三:zs
// 正常的命名空间定义
namespace sc
{
int rand = 0;
}
//主函数
int main()
{
printf("%d", rand);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace sc
{
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
//注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中命名空间使用
//命名空间中成员该如何使用呢?比如:
struct Node
{
struct Node* next;
int val;
};
}
int main()
{
printf("%d\n", sc::rand);
//::域作用限定符,用来访问我们自己命名空间里的变量
printf("%d\n", sc::Add(1,2));
//结构体的命名时::加的位置要注意
struct sc::Node node;
return 0;
}
想要调用自己命名区域里的函数等必须用名字加::,并且结构体的命名时::加的位置要注意!
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace sc
{
int Add(int left, int right)
{
return left + right;
}
}
int Add(int left, int right)
{
return left + right;
}
int main()
{
printf("%d\n", sc::Add(1,2));
printf("%d\n", Add(2,3));
return 0;
}
在这段代码里,我们有两个Add函数,作用和名字均相同,但是我们不用顾及冲突的问题,这就是c++改良的第一点
运行截图:
有的同学认为每次都是用::这个符号太麻烦了,那么有没有什么方法可以直接用,有的
using namespace sc
就是在命名空间后加上这句话,这句话的意思就是展开命名空间,use使用的意思,本质就是把命名空间展开了,不用再::就可以使用sc这个命名空间里的各种东西,就像是你拥有一个果园,平时只有拥有一把名字为::的药匙才能进入,现在在门口使用了万能钥匙,无限制就可以用,也不需要钥匙
当使用了这句话,首当其冲的就是一个问题,就是选择问题,什么意思呢
请看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace sc
{
int Add(int left, int right)
{
return left + right;
}
}
int Add(int left, int right)
{
return left + right;
}
using namespace sc;
int main()
{
printf("%d\n", Add(1, 2));
printf("%d\n", Add(2, 3));
printf("%d\n", Add(3, 4));
printf("%d\n", Add(4, 5));
printf("%d\n", Add(5, 6));
return 0;
}
仔细阅读代码,这种情况下,你能准确分出我们调用的五个Add都是那个命名空间里的吗,计算机业分不清,所以在没有把握的情况下不要轻易展开命名区域,还是用::最为稳妥。
有完全展开,就有部分展开,在大多数c++从业的代码中,这种方式是最多的
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace sc
{
int rand = 0;
int Add(int left, int right)
{
return left + right;
}
}
//部分展开
using sc::Add;
int main()
{
printf("%d\n", rand);
printf("%d\n", Add(2, 3));
return 0;
}
这就是部分展开,只展开的Add函数,但是rand并未展开,想要打印我们命名区域里的rand,依旧要用::。
命名空间的嵌套
命名空间可以套命名空间,无限套娃,上代码:
namespace sc
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace sd
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
顾名思义就是在一个命名空间里再套用一个命名空间
使用方式:
也就是嵌套::的事,由图可见,图中三个rand都位于不同的地址,编译器也没有发现问题
c++标准输入输出流
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world"<<endl;
return 0;
}
这一串代码相信学过C语言的大家都有些似曾相识,没错,这就是c++输出hello world 的代码
根据我们对命名区域的讲解,其中std是c++标准库的命名空间,和C语言不同,c++的语句都位于命名空间中,所以我们想进行输入输出一定要using namespace std
缺省参数
缺省参数的概念
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void Func(int a = 1)
{
cout << a << endl;
}
int main()
{
Func(); //没有传参时,使用参数的默认值
Func(10); //传参时,使用指定的实参
return 0;
}
大家看这段代码,思考一下输出应该是什么?
运行截图:
相信大家心中已经有了想法,我们在函数参数中定义一个a,在c++中可以给这个参数定义一个值,当主函数调用有实参传过来的时候,就用传过来的参数,如果没有传参,就用我们自己定义的数字,这个a就是缺省参数,是不是很好理解。
缺省参数分类
全缺省参数
顾名思义就是哈纳树中所有的形参都是缺省参数:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void Func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
Func();
Func(1);
Func(1,2);
Func(1,2,3);
return 0;
}
代码中所有的形参都是缺省参数,主函数中我们有四种玩法,传参个数从0到多,且看运行截图
半缺省参数
也就是只有一部分参数是缺省参数
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void Func(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl<<endl;
}
int main()
{
Func(1);
Func(1,2);
Func(1,2,3);
return 0;
}
如代码所示,函数的参数只有两个是缺省的,大家自己试试运行一下
注意事项:
//a.hvoid Func ( int a = 10 );// a.cppvoid Func ( int a = 20 ){}// 注意:如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
函数重载
概念:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
// 1、参数类型不同
//C语言不允许同名函数
//cpp可以,但是要求构成函数重载
//函数名相同,参数不同
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;
}
int main()
{
cout << Add(1, 2) << endl;
cout << Add(1.2, 2.2) << endl;
return 0;
}
look代码,仔细阅读不难发现我们定义了两个名字完全相同的函数,这在C语言中无疑是不允许的,但是在c++中完全可以,c++的特点是自动匹配函数,我们在主函数中两次调用Add函数,一个传参都是浮点数,一个都是整数,c++十分只能,它能自己分析你传参的类型选择对应的函数,所以两个参数不同,但是名字相同的函数在c++中被允许,这就是函数重载
运行截图:
怎么样,c++是不是比C语言简便只能多了,真是🐕都不用C语言(哈哈哈哈开玩笑啦)
返回值不同,不能构成重载!!!
本期的内容就到这里,下期博主给大家带来c++入门第二课。