C++语言是对C的一种扩充和优化,同时引入了OOP(面向对象编程)的思想。因此,建议掌握了C语言的基本使用和语法再进一步学习C++。同时了解C++与C语言的区别。ios
其实C++对C的扩充不少,在这里描述一些经常使用的点。剩余的琐碎知识会慢慢的说到。程序员
#define _CRT_SECURE_NO_WARNINGS #include <iostream> //using namespace std; int atk = 200; void test() { int atk = 100; std::cout<<"test中的atk<< atk << std::endl; std::cout<<"全局中的atk<< ::atk << std::endl; } int main() { test(); return 0; }
这段代码会一一讲解#define \_CRT\_SECURE\_NO\_WARNINGS
这是一个宏,若是是使用vs系列的编译器,在程序编译的时候可能出现C4996错误,经过这个宏基本能够解决这个问题编程
以后会涉及如下三个知识点:函数
using namespace std;
这是一句十分常见的代码(但并不推荐这么使用)
其中std是标准命名空间,若是不写这条语句 会没法使用诸如cout,cin 等等。由于C++标准的标识符都被记录在std的命名空间中。除了以上的语句,咱们还可使用做用域运算符(::)来单独的使用某一个标识符:std::cout<<"hello World!<<std::endl;"
其实更加推荐以上的写法。
在C++中,程序员除了可使用系统提供的命名空间。还能够本身写命名空间,而命名空间的做用就是 消除名称的冲突。
如下是namespace的使用:学习
//test1 #include <iostream> using namespace std; namespace test1 { void test() { cout<<"这里是test1"<<endl; } } //test2 namespace test2 { void test() { cout<<"这里是test2"<<endl; } } //main int main() { test1::test(); test2::test(); return 0; }
结果可想而知:
除此以外namespace还有如下几点:优化
1.namespace下能够放函数,变量,类,结构体spa
2.namespace必须做用到全局做用域中。code
3.nameapace能够嵌套。(若是是嵌套的话须要连续使用做用域运算符)对象
4.namespace是开放的,能够随时添加内容blog
namespace A { ... } ... namespace A { ... }
这样写的话这两个A是能够链接起来,而不是覆盖。
5.能够有无名(匿名)的命名空间。至关于一个static只能在当前文件内使用(基本没什么用,知道有这么回事就好了)
6.命名空间能够有别名。若是起的第一个名字太长了,不方便使用。能够用一个新的名字(仔细想一想好像也没什么用,毕竟起名是全部程序员不得不去面对的一个难题)
namespace test { int a = 10; } void test1() { using test::a;//using 声明 std::cout<<a<<std::endl; }
using namespace test;//using 编译声明
[注]编译器是有就近原则的。using声明会与就近原则产生二义性,using编译指令会服从就近原则;由于using编译指令只是声明了命名空间,不必定非要使用。而using声明就是声明nanespace里面的一个标识符,这样天然会冲突。
#include <iostream> using namespace std; namespace A { int aa = 10; } //using声明: void test01() { int aa = 20; using A::aa; //写下以上这行代码,编译器会报错 //using声明后,AtkofQOP便是在Dota2命名空间下的 //同时编译器又是有就近原则的, //因此产生了二义性 cout<<aa<<endl; } namespace B { int aa = 30; } //using 编译指令 void test02() { int aa = 20; //使用using 编译指令 using namespace A;//打开A的命名空间,不必定会去使用,依旧是服从就近原则! cout<<aa<<endl; //输出内容是20 //若是注释int aa = 20; //同时打上 using namespace B,咱们在输出aa时,编译器就没法辨认了 //若是使用(打开)的命名空间过多,注意必定要使用做用域运算符指定具体的位置 //这就是为啥不推荐直接写using namespace std;的缘由,用的多了会引发没必要要的混乱 }
在一开始给出的例子中,咱们看到了::的做用(指定全局,其实就是::前面什么都没有,就默认是全局了)。结合namespace也不难理解::的做用。就是做用域是指定,这个做用域不只是namespace 还包括后面类的成员变量和成员函数。只要是须要指定变量或者函数的所属,都会用到做用域运算符。