本文章是我对C++学习的开始,很荣幸与大家一同进步。
首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计
根据今年一月TIOBE公布的排行榜,C++依然稳居前三,可见这是一款非常优秀的编程语言
在C语言中我们时常遇见这样的冲突:
重定义!!!总是不小心定义相同变量,多人操作的时候很难避免这个问题。
于是C++为了避免这类问题,引入了“命名空间”的概念;
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
如活动定义一个命名空间呢?这里需要使用namespace关键字
namespace name
{
// 命名空间中可以定义变量/函数/类型
int a = 0;
double add(double a,double b){
return a + b;
}
struct node{
int val ;
int size;
}
}
并且可以做到嵌套定义:
namespace name1{
namespace name2{
//...
}
}
注意:
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
使用命名空间主要有三种使用方法:
1 加命名空间名称及作用域限定符;
2 使用using将命名空间中某个成员引入;
3 使用using namespace 命名空间名称 引入.
来看第一种:
命名空间名称及作用域限定符
#include
//定义两个命名空间
namespace name1 {
int a = 0;
}
namespace name2 {
int a = 0;
}
int main() {
//使用 作用域限定符 ::
name1::a = 1;
name2::a = 1;
return 0;
}
使用using将命名空间中某个成员引入
#include
//定义两个命名空间
namespace name1 {
int a = 0;
int b = 0;
}
//只有引入的变量才可以省略 命名空间和 作用域符号;
using namespace name1::a;
int main() {
//使用 作用域限定符 ::
a = 1;
name :: b = 2;
return 0;
}
使用using namespace 命名空间名称 引入
#include
//定义两个命名空间
namespace name1 {
int a = 0;
int b = 0;
}
//引入命名空间后,其中的变量/函数/结构体
//可以直接使用
using namespace name1;
int main() {
a = 1;
b = 2;
return 0;
}
c++中的输入输出与C语言略有不同。来看样例
#include
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}
cout
标准输出对象(控制台)和cin
标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。cout和cin是全局的流对象
,endl是特殊的C++符号,表示换行输出,他们都包含在包含头文件中。我们来看样例:
#include
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
char a = 0;
int b;
float c = 0;
cin >> a;
//支持连续输入,并自动识别类型。
cin >> b >> c;
cout << "输出\n" << a << '\n' << b << '\n' << c << '\n' << endl;
return 0;
}
这方面就比C语言的printf scanf
等函数方便许多。
大家也一定注意到了一点,c++中既然直接使用了变量名输出,那如何控制输出格式呢?答案是有办法实现的,就是比较复杂。所以我们直接使用C语言
中的printf
函数即可,毕竟c++兼容绝大部分的C语言。
缺省参数的概念十分好理解,就是在函数定义中加入参数的默认值,并且在没有传入对应参数时,使用默认值。
来看样例:
// 全缺省
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 << endl;
}
int main()
{
//半缺省
Func(1, 2, 3) ;
Func(1, 2);
Func(1);
//全缺省
Func();
return 0;
}
在C语言中我们无法实现同一个函数名返回不同类型值或者使用不同类型参数。
所以就导致简单的加和函数Add
如果要实现不同类型的加和不免会出现:
AddInt
AddFloat
AddChar
···
不仅繁琐,而且调用的时候也不方便。
在自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了
c++ 于是就引入了函数重载的概念。
来看样例:
#include
using namespace std;
int Add(int a = 0, int b = 0) {
return a + b;
}
double Add(double a = 0.0, int b = 0) {
return a + b;
}
int main()
{
cout << Add(1, 2) << endl;
cout << Add(3.14, 2) << endl;
return 0;
}
那么这么强大的函数重载是如何实现的呢???
答案就在汇编代码中
在c++中,对于一个函数的储存与C语言不同,C++使用了更加具体命名方式(具体要看编译器);我个人非常喜欢g++的形式。上面两个函数分别为:
_Z3Addii
_Z3Adddi
目前我还没有能力深入讲解其中的道理。