- c++难学吗
- C++关键字
- 1 命名空间 namespace关键字
- 1.1.1命名空间的定义
- 1.1.2 命名空间的嵌套
- 1.1.3 命名空间的使用
- 1.2 using namespace std 是什么意思?
- 2 缺省参数/默认参数
- 2.1 全缺省
- 2.2 半缺省
- 3 函数重载
C++肯定是难学的。C++的语法比Java难20%~30%,但是整体难度是一样的。
学习C++除了掌握必要的语法外,还需要学习STL、高阶数据结构。
在看视频的同时,还需要大量的代码练习,同时还需要阅读大量的书籍。
入门阶段需要阅读《C++程序设计语言》、《高质量程序设计指南》。
潜心修行阶段需要看如《Effective C++》。还需要把《C++ Primer》这本书作为一个语法字典。
阅读过《(More)Effective C++》、《(More)Exceptional C++》、 《EffectiveSTL》及《C++编程规范》等,才适宜踏入专业C++开发之路;
大佬们建议不要把「精通C++」作为一个一年目标,应该要把学习语言作为一个持续的过程,同时要把语言运用在具体的应用场合中。
C++关键字C++总计63个关键字,C语言32个关键字,C++的出现就是为了解决C语言中不足的地方,所以有很多关键字是一样的,除此之外,还增加了其他的关键字
| asm | do | if | return | try | continue |
|---|---|---|---|---|---|
| auto | double | inline | short | typedef | for |
| bool | dynamic_cast | int | signed | typeid | public |
| break | else | long | sizeof | typename | throw |
| case | enum | mutable | static | union | wchar_t |
| catch | explicit | namespace | static_cast | unsigned | default |
| char | export | new | struct | using | friend |
| class | extern | operator | switch | virtual | register |
| const | false | private | template | viod | true |
| const_cast | float | protected | this | volatile | while |
| delete | goto | reinterpret_cast |
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,尤其是在公司的大项目中,一个模块有很多人来写,但是不可避免的会有A创建的变量是B创建的一个函数,如果这个变量需要被大量使用,那么不论是谁更改都是一件很麻烦的事情。
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1.1.1命名空间的定义例如rand是一个函数,但是我现在创建了一个名为rand的变量,很明显就发生了冲突,那么我就定义一个名为sym的空间域,这样就不会发生冲突。
#include#include //命名空间域,放在这里和其他的变量隔离 namespace sym { int rand = 100; } int a = 0;//全局变量a int main() { int a = 1;//局部变量 printf("%dn", rand);//使用的rand函数 printf("%dn", sym::rand);//使用命名空间sym里面的rand变量 printf("%dn", a);//访问的局部变量 printf("%dn", ::a);//域作用限定符,访问全局变量,左边是空白,默认访问全局域 return 0;//::域作用限定符号 }
命名空间可以定义变量,函数,结构体。。。
比方说,字节公司有两个小组,一个是做数据的,一个是做缓存的。但是在主函数中,需要他们命名空间中的变量,但是恰好他们定义的变量名相同,这个时候就需要对命名空间再做一次嵌套,以示区别。
#include#include namespace byte//字节公司 { namespace data//数据组 { struct Node { int val; struct Node* next; }; } } namespace byte { namespace cache//缓存组 { struct Node { int val; struct Node* next; }; } } int main() { byte::cache::Node n1; byte::data::Node n2; return 0; }
同名的命名空间可以同时存在,编译器编译时会合并。
按照上面程序
方法一:加命名空间名称及作用域限定符
byte::cache::Node n1; byte::data::Node n2;
方法二:使用using namespace 命名空间名称引入
using namespace byte;
int main()
{
cache::Node n1;
data::Node n2;
return 0;
}
全部放出来,显然就失去了意义
方法三:使用using将命名空间中成员引入
using byte::data::Node;
int main()
{
byte::cache::Node n1;
Node n2;
return 0;
}
1.2 using namespace std 是什么意思?
使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。
#includeusing namespace std;//std 封C++库的命名空间 int main() { cout << "hello world" << endl; // >> 流提取 // << 流插入 return 0; }
这相当于是对命名空间使用的第二种方法,把std里面的变量、函数全部放出来。这里给出了我对namespace的理解:
c语言里面没有这个语法。
在声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
全缺省就是所有的参数都给缺省值。
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl<
TestFunc(1, 2, 3);
TestFunc(1);
TestFunc(1, 2);
TestFunc();
return 0;
}
目前只能一个一个地传,还不能实现只给b传不给a传。
必须从右往左缺省,并且是连续的
void TestFunc(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl<
TestFunc(1);
TestFunc(1, 2);
TestFunc(1, 2, 3);
//TestFunc();
return 0;
}
当在写数据结构的时候,如果要建立一个栈,需要对它初始化,还需要开辟内存空间。如果使用缺省参数,可以在默认情况下开辟四个空间,如果需要50个空间,只需要传参50就行了。
注意:缺省参数不能在函数声明和定义中同时出现,因为它怕你声明和定义给的缺省参数不一样。
正确的做法是:声明给,定义不给。
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序,其中的一个或几个)必须不同,常用来处理实现功能类似数据类型不同的问题。
比如一个加法函数Add,我需要实现的是它的整型相加、浮点型相加、长整型相加,也就是说形参列表需要传入不同的参数。这个时候就需要函数重载。
#includeusing namespace std; int Add(int left, int right) { return left + right; } double Add(double left, double right) { return left + right; } long Add(long left, long right) { return left + right; } int main() { cout< void f(int i, double d) { cout << "f(int i, double d)" << endl; } void f(double d,int i) { cout << "f(double d,int i)" << endl; } int main() { f(2, 2.1); f(2.1, 2); return 0; }
问:int compare(int ,int)是不是double compare(int,int)的重载函数?
答:不是的。函数重载不能依靠返回值的不同来构成重载,因为调用时无法根据参数列表确定调用哪个重载函数。



