内容简介:先讲C++基本类型吧,字符串就有两种,C++的bool可以取值true或false,true、false都是关键字。但是int也可以直接赋值给bool,难道bool是int的派生类型?
基本类型
先讲C++基本类型吧,字符串就有两种, std::string
和 char*
,有人说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++真他妈复杂》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Introduction to Tornado
Michael Dory、Adam Parrish、Brendan Berg / O'Reilly Media / 2012-3-28 / USD 23.99
Tornado is a scalable, non-blocking web server and web application framework written in Python. It is also light-weight to deploy, fun to write for, and incredibly powerful. Tornado was written with p......一起来看看 《Introduction to Tornado》 这本书的介绍吧!