查看: 177|回复: 0

从零开始学C++(1 变量和基本类型)

[复制链接]
发表于 2020-2-3 00:50:15 | 显示全部楼层 |阅读模式
  接下来的几篇文章先容C++的底子知识点。

  C++是一种静态数据类型语言,它的类型查抄发生在编译时。因此,编译器必须知道程序中每一个变量对应的数据类型。
  数据类型是程序的底子:它告诉我们数据的意义以及我们能在数据上实行的利用。
  比如:i = i + j;   这条语句的具体寄义要取决于i、j的类型
  
  void也是一种类型,即空类型。
  算术类型:整型(integral type,包括字符和布尔类型)、浮点型
  算术类型所占的位(bit)数,在不同呆板上有所差异。C++标准规定了类型的最小尺寸,比如int最小占16位,char最小占8位,long最小占32位,long long最小占64位,float最小6位有效数字,double最小10位有效数字等等。
  布尔类型(bool)的取值是真(true)大概假(false)。
  基本的字符类型是char,一个char的空间应确保可以存放呆板基本字符集中任意字符对应的数字值。其他字符类型用于扩展字符集,如wchar_t、char16_t、char32_t。wchar_t类型用于确保可以存放呆板最大扩展字符集中的任意一个字符,char16_t和char32_t则为Unicode字符集服务(Unicode是用于表示所有自然语言中字符的标准)。
  
   简单先容一下内置类型的呆板实现:
    计算机是以二进制形式存储数据的,也就是每个位非0即1。一般计算机都以2的整数次幂个bit作为块来处理内存,大多数以 8 bits 构成一个最小的可寻址内存块,称之为一个字节(byte)。
    而计算机将内存中的每个字节与一个数字(也就是地址)关联起来,比方:
    

    图中,左侧的数字是该字节的地址,右侧是 8 bits的具体内容。
    使用某个地址来表示从这个地址开始的大小不同的比特串,比方,地址1000的谁人字,地址1003的谁人字节。由此可见,为了明确某个地址的寄义,必须首先知道存储该地址的数据的类型,也就是需要知道数据所占的位数以及该怎样解释这些bit的内容。

  带符号类型(signed)和无符号类型(unsigned)
    类型int、short、long和long long都是带符号的,类型名前添加unsigned得到无符号类型。
    字符型被分为了三种:char、signed char和unsigned char。特别需要留意的是:类型char和类型signed char并不一样。类型char实际上会表现为带符号的和无符号的两种形式中的一种,具有是哪种由编译器决定。

  类型转换(convert):将对象从一种给定的类型转换为另一种相关类型。
  如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现非常结果:
  1. int val1 = 10;unsigned val2 = -20;std::cout  b ? a : b);  }
复制代码
  
  对于第二条:
  1. STL迭代器系以指针为根据塑造出来,所以迭代器的作用就像个T*指针。声明迭代器为const就像声明指针为const一样(即声明一个T* const指针)。如果盼望迭代器所指的东西不可被改动(即盼望STL模仿一个const T*指针),则使用const_iterator:  std::vector vec;  const std::vector::iterator iter = vec.begin();  // iter的作用像个T* const  std::vector::const_iterator kIter = vec.begin(); // kIter的作用像个const T*类中不恰当的声明const成员函数的例子:class CTextBlock {public:  char& operator[](std::size_t position) const // bitwise const声明,但实在不得当  {    return m_ptext[position];  }private:  char *m_ptext;};重载的operator[]函数,被声明为const成员函数,但是却返回一个reference指向对象内部值。operator[]实现代码并不更改m_ptext,于是编译器很开心地为operator[]产出目标码。但是:  const CTextBlock kctb("Hello");  // 声明一个常量对象  char *pc = &kctb[0];  *pc = 'J';  // kctb现在的内容为"Jello"mutable(可变的)释放掉non-static成员变量的bitwise constness约束在const和non-const成员函数中避免重复假设TextBlock内的operator[]不单只是返回一个reference指向某个字符,也实行边界查验(bounds checking)等:class TextBlock {public:  const char& operator[](std::size_t position) const  {    ... // 边界查验    ... // 日志记录数据访问(log access data)    ... // 查验数据完整性(verify data integrity)    return m_text[position];  }  char& operator[](std::size_t position)  {    ... // 边界查验    ... // 日志记录数据访问(log access data)    ... // 查验数据完整性(verify data integrity)    return m_text[position];  }private:  std::string m_text;};上面的代码中包含很多重复代码,以及伴随的编译时间、维护、代码膨胀等问题。就算将边界查验...等代码移到一个函数内,也会存在重复代码:函数调用、两次return语句等等。真正应该做的是实现operator[]的性能一次并使用它两次,也就是说,必须令其中一个调用另一个。将常量性转除,这里将返回值的const转除是安全的:class TextBlock {public:  const char& operator[](std::size_t position) const  {    ...    ...    ...    return m_text[position];  }  char& operator[](std::size_t position)  {    return const_cast(static_cast(*this)[position]);  }};如果不实行static_cast转换,则会递归调用自己。令const版本调用non-const版本以避免重复————不应该如许做。记着,const成员函数承诺绝不改变其对象的逻辑状态(logical state),non-const成员函数却没有这般承诺。
复制代码

相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表