C++真他妈复杂

栏目: C++ · 发布时间: 6年前

内容简介:先讲C++基本类型吧,字符串就有两种,C++的bool可以取值true或false,true、false都是关键字。但是int也可以直接赋值给bool,难道bool是int的派生类型?

基本类型

先讲C++基本类型吧,字符串就有两种, std::stringchar* ,有人说char*是C时代的产物,在C++里用std::string就好。那main函数的第二个参数还是必须为 char*[] ,而且字符串字面值”hello”的类型是char*,经常不能直接传给string。

C++的bool可以取值true或false,true、false都是关键字。但是int也可以直接赋值给bool,难道bool是int的派生类型? std::cout << true ,结果为1,似乎bool和int可以相互转化,令人困惑。比较起来,Java需要强制类型转换才能把bool变成int,说明bool和int是两种独立类型。JavaScript console.log(true) 输出的是true,说明bool是一种原始类型。

string.find() 返回类型是 size_t ,但可以赋值给int,那为什么不直接是int(原因省略),不直观。Java、C#就是返回int或long,非常一致。

数组

C++的数组,既可以看成数组,又可以看成指针,这种“波粒二象性”令人困扰。

复杂类型

C++可以对一个类型取引用、取指针。比如int指针类型定义为 int*p=&a ,这里把变量a取地址,赋给指针p。int引用定义为int&p=a。同一个&符号,在左边在右边意思不一样!而且,*前后有没有空格都没有关系。我个人觉得 int* p 表示p是int*类型,然而大部分人似乎写成 int *p ,看起来*就像是对p的运算符。

C++可以声明变量或参数为const,而且经常不得不用const。比如 char* c_arguments[] = { "hi","bye" } 就会出错, const char* c_arguments[] = { "hi","bye" } 才可以。在 Java 、C#里,final、const基本上是加强自我约束的东西,编译器不会逼着你写。

取引用、取指针、数组、const,合起来可以写非常复杂的复杂类型,比如 char*(*arr[10])(int*&p); ,读作arr是一个有10个成员的数组,成员类型为指针,指针指向一个函数,该函数的参数的名称为p,类型为int的指针的引用,函数返回值为char引用。复杂类型的读法是左右散开的方式。类似的东西,用C#来写就是 func<int,char[]>[] arr ,简洁易懂。类型在左边,变量名在右边。不需要也不允许指定那个函数参数的名称。

函数调用

C++要求函数定义必须出现在函数调用之前。如果这个规定是强制的,也就算了,因为Bash、JavaScript都是这种要求。好死不死,C++还有个函数声明的概念,其实只要函数声明在函数调用之前就可以了,因为这个,就出现了所谓头文件(.h)的东西,头文件里只写声明,cpp文件里写定义。

函数也可以有指针,这样操作就很烦了。

面向对象

有两种访问成员运算符, .-> 。如果变量是指针,就要用->。实际上,也可以用 (*pt).member 。这样凭空多出来一个->运算符。


以上所述就是小编给大家介绍的《C++真他妈复杂》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

腾讯产品法

腾讯产品法

李立 / 浙江大学出版社 / 2018-1 / 49元

从QQ到微信,从《英雄联盟》到《王者荣耀》,腾讯公司凭借强大的产品力成为世界互联网企业中的佼佼者,其“小步快跑,试错迭代”的产品开发机制,“别让我思考”的极简主义理念,“变成白痴级用户”的用户驱动战略,都成为整个中国互联网行业竞相学习的典范。 本书向读者完整地呈现了腾讯产品设计的底层思路,阐述了设计者如何发现问题、定义问题、拆解问题的全过程,从“产品思维”出发,以需求、战略、产品设计开发与运......一起来看看 《腾讯产品法》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具