C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。
为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。
因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
C++是可以兼容C语言语法的,它同时也有自己独有的新内容,今天,就来初步了解一下C++。
老样子,先从精通C++的“Hello world!“写法开始。
#include
using namespace std;
int main()
{
cout << "Hello world!"<< endl;//endl是换行
return 0;
}
你是否曾经有那么一丢丢的疑惑using namespace std;
是干啥的?
稍等,我们再看几个例子,铺垫铺垫:
#include
using namespace std;
#include //里面有个叫rand的函数
int rand = 0;
int main()
{
printf("%d\n", rand);
return 0;
}
因为
为了解决命名冲突问题,CPP引入namespace命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员
#include
using namespace std;
#include //里面有个叫rand的函数
//为了解决命名冲突问题,CPP引入namespace
//同一个域里面不能有重名变量
namespace cpp//命名空间域,这里起名为cpp,本空间与外界空间进行隔离
{
int rand = 0;
}
int main()
{
printf("%d\n", rand);
return 0;
}
成功通过了,但这里打印的不是0,而是一串数字。因为这里打印的是函数rand的地址,而不是rand变量的大小(因为rand变量被cpp命名空间关起来了,函数rand和变量rand就不在同一个域了,不会有命名冲突问题)。
那如果我想要访问变量rand该怎么做呢?我们引入::
域作用限定符,访问cpp命名空间里的rand
#include
using namespace std;
#include //里面有个叫rand的函数
//为了解决命名冲突问题,CPP引入namespace
//同一个域里面不能有重名变量
namespace cpp//命名空间域,这里起名为cpp,本空间与外界空间进行隔离
{
int rand = 0;
}
int main()
{
printf("%d\n", cpp::rand);//:: 域作用限定符,::前面是空白就默认全局域
return 0;
}
1️⃣命名空间中的内容既可以定义变量,也可以定义函数和类型
namespace tyyg // tyyg为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数和类型
int a;//变量
int Add(int left, int right)//函数
{
return left + right;
}
struct ListNode//类型
{
int val;
struct ListNode* next;
};
}
2️⃣命名空间可以嵌套使用,例如:
namespace OUT//外
{
int a;
int b;
namespace IN//内
{
int c;
int Sub(int left, int right)
{
return left - right;
}
}
}
3️⃣同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
//data.h
namespace abc
{
int a = 0;//a还是全局变量,命名空间不影响生命周期,只是把a隔离开了
namespace data
{
struct Node
{
int val;
struct Node* next;
};
}
}
//cache.h
namespace abc
{
int b = 0;
namespace cache
{
struct Node
{
int val;
struct Node* next;
};
}
}
int main()
{
struct abc::data::Node n1;
n1.val = 1;
struct abc::cache::Node n2;
n2.val = 3;
return 0;
}
它们在不同的文件中,编译器最后会合成同一个命名空间abc中,为了区分两个Node,我们嵌套了一层命名空间。最后通过::
来创建两个不同类型的结构体变量n1和n2。(这里的struct abc::data::Node
只是一种类型)
如果我想简化一下,不想写abc::
,我该怎么改呢?
//data.h
namespace abc
{
int a = 0;//a还是全局变量,命名空间不影响生命周期,只是把a隔离开了
namespace data
{
struct Node
{
int val;
struct Node* next;
};
}
}
//cache.h
namespace abc
{
int b = 0;
namespace cache
{
struct Node
{
int val;
struct Node* next;
};
}
}
//这里的意思是把abc这个命名空间定义的东西放出来
using namespace abc;
int main()
{
struct data::Node n1;
n1.val = 1;
struct cache::Node n2;
struct cache::Node n3;
struct cache::Node n4;
struct cache::Node n5;
n2.val = 3;
return 0;
}
这里要用using namespace abc;
这个语句,意思是把abc这个命名空间定义的东西放出来。要按顺序从外到内展开,否则会找不到。另外还能using namespace abc::data;
这样只展开一部分,只展开abc里的data,不展开abc里的cache。一般我们最好用什么展开什么,以免又引起重名(好不容易搞个命名空间,一放回到解放前)。
是不是很眼熟?还记得hello world吗,那个using namespace std;
也是这个作用。如果我们不加using namespace std;
该怎么写?
#include
//using namespace std;//把它注释掉
int main()
{
std::cout << "Hello world!"<< std::endl;//std是C++标准库的命名空间
return 0;
}
其实还有一种展开的办法:只放出常用的,using std::cout;
#include
using std::cout;
int main()
{
cout << "Hello world!"<< std::endl;
std::cout << "Hello world!"<< std::endl;
//放出来的,加不加原本的std::都行。没放出来的(t)如果不加原本的命名空间std::就会报错
return 0;
}
比起C语言,C++有着它特有的输入输出方式。其实在前面我们已经多次使用了,就是cin输入和cout输出
#include
using namespace std;
int main()
{
int a = 0;
//scanf("%d", &a);
// >> 流提取运算符
cin >> a;
//printf("%d\n", a);
// << 流插入运算符
cout << a;
return 0;
}
说明:
1️⃣ 使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。
⚠️注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;
旧编译器(vc 6.0)中还支持
格式,后续编译器已不支持,因此推荐使用
的方式。
2️⃣ 使用C++输入输出更方便,不需增加数据格式控制,自动识别类型,比如:整形–%d,字符–%c
#include
using namespace std;
int main()
{
int a;
double b;
char c;
cin>>a;
cin>>b>>c;
cout<<a<<endl;
cout<<b<<" "<<c<<endl;
return 0;
}
3️⃣ 如果想要控制浮点数小数点后的位数,建议还是用回C语言的printf吧(C++兼容C语言),cout处理这个会很困难
4️⃣cin,cout会比scanf,printf慢一些,如果做题时追求速度,建议使用scanf,printf
不知不觉,我们都讲到C++了,未来还有更多内容哦
滚来滚去……~(~o ̄▽ ̄)~o 。。。滚来滚去……o~(_△_o~) ~。。。
目前在不断更新
的知识总结,已经更新完了 <数据结构>,未来我会系统地更新 等内容。想要系统学习编程的小伙伴可以关注我!