美文网首页
Chapter 2 Note of C++ Primer By

Chapter 2 Note of C++ Primer By

作者: AlexBrinton | 来源:发表于2016-06-27 20:06 被阅读0次

Primitive Built-in Types

Variables

Compound Types

const Qualifier

Dealing with Types

As programs get more complicated, using types also gets more complicated.
Two different ways:

  • Hard to "spell"
    • Forms are tedious and error-prone to write
    • Forms obscure the types' purpose or meaning
  • Hard to determine the exact type we need

Type Aliases

Traditionally, we use a typedef:

typedef double wages;
typedef wages base, \*p;

The keyword typedef may appear as a part of the base type of a declaration. Declarations that include 'typedef' define type aliases rather than variables. The declarators can include type modifiers, too.
The C++ 11 way, alias declaration:
using SI = Sales_item

Pointers, const, and Type Aliases

  typedef char \*pstring;
  const pstring cstr = 0; // cstr is a constant pnt to char
  const pstring \*ps; // ps is a pnt to a constant pnt to char

It can be tempting, albeit incorrect, to intepret a declaration that uses a type alias by conceptually replacing the alias with its corresponding type:
const char *cstr = 0; //wrong intepretation of const pstring cstr

The auto Type Specifier

Deduce the type of vars from the initializers. A var that uses auto as its type specifier must have an initializer.
A declaration can involve only a single base type. So the initializers for all vars in the declaration must have types that are consistent with each other.

Compound Types, const, and auto

The compiler adjusts the type to conform to normal initialization rules.

First, when using a ref as an initializer, the initializer is the corresponding object.

int i = 0, &r = i;
auto a = r; //a is an int

Second, auto ordinarily ignores top-level consts.

const int ci = i, &cr = ci;
auto b = ci; // int
auto c = cr; // int
auto d = &i; // int*
auto e = &ci; // const int*

If we want deduced type to have a top-level const, we must say so explicitly:
const auto f = ci; //deduced type of ci is int, f has a type const int
We can also specify that we want a ref to the auto-deduced type:

auto &g       = ci; // g is a const int& that is bound to ci
auto &h       = 42; // error: we can't bind a plain ref to a literal
const auto &j = 42; // ok: we can bind a const ref to a literal

When we ask for a ref to an auto-deduced type, top-level constsin the initializer are not ignored.
In a single statement, the initializers must provide consistent auto-deduced types:

auto k  = ci, &l = i; // k is int, l is int&
auto &m = ci, *p = &ci; // m is const int&, p is a pnt to const int
// error: type deduced from i is int, while type deduced from &ci is const int
auto &n = i, *p2 = &ci;

The decltype Type Specifier

Sometimes, we want to define a var with a type that the compiler deduces from an expr but don't want to use the expr to init the var.
C++ 11 feature, decltype returns the type of its operand.
decltype(f()) sum = x; // sum has the type f returns
The way decltype handles top-level const and refs differs subtly from the way auto does.
Whe the expr to which we apply decltype is a var, decltype returna the type of that var, including top-level const and refs:

const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x has type const int
decltype(cj) y = x; // y is a const int& cound to x
decltype(cj) z; // error: z is a ref and must be initialized

decltype is the only context in which a var defined as a ref is not treated as a synonym for the obj to which it refers.

decltype and References

When applying decltype to an expr that isn't a var, we get the type that the expr yields. decltype returns a ref type for exprs that yield objs that can stand on the left-hand side of the assignment.
Assignment is an example of an expr that yields a ref type. The type is a ref to the type of the left-hand operand.

Defining Our Own Data Structure

Defining the Sales_data Type

struct Sales_data {
    std::string bookNo;
    unsigned units_sold;
    double revenue = 0.0;
};

Class Data Members

members, data members
C++ 11: in-class initializer
In-class initializers are restricted as to the forms we can use: They must either be enclosed inside curly braces or follow an = sign.

Using the Sales_data Class

Reading Data into a Sales_data Object

Writing Our Own Header Files

Headers usually contain entities that can be defined only once in any given file.

A Brief Introduction to the Preprocessor

The preprocessor is a program that runs before the compiler and changes the source text of our programs.
Preprocessor vars have one or two possible states: defined or not defined.
Preprocessor var names don't respect C++ scoping rules.

相关文章

  • Chapter 2 Note of C++ Primer By

    Primitive Built-in Types Variables Compound Types const Q...

  • c++学习笔记——第一天

    一、c++综述 (1)书籍推荐 ①、c++ primer ②、c++ primer plus ③、c++编程思想 ...

  • [C++ Primer Note2] string,vector

    前文介绍的内置类型是C++语言直接定义的。这些类型,比如数字和字符,体现了大多数计算机硬件本身具备的能力。标准库定...

  • C primer Plus study note chapter

    循环语句: while( expression ) 循环语句根据语句中的判断条件对判断条件进行判断,如果表达式ex...

  • C primer Plus study note chapter

    数组和指针 头文件:把函数原型和已定义的字符常量放在头文件中是一个良好的编程习惯 指针取址运算符 &用于拿到变量的...

  • C primer Plus study note chapter

    存储类别:C中提供了许多不同的模型或者存储类别在内存中存储数据。从硬件方面看:被存储的值都占用了一定的物理内存,C...

  • C primer Plus study note chapter

    运算符、表达式、语句基本运算符:=,+,_*,/,指数运算符在C中是不存在的,C中提供了一个专门的函数进行指数运算...

  • C primer Plus study note chapter

    条件控制语句if(){}else{}语句 getchar();本函数从终端读取输入的字符赋给一个字符对象,当遇上回...

  • C primer Plus study note chapter

    字符串是由空字符结尾的char类型数组字符串常量:双引号括起来的内容称为字符串常量。字符串常量属于静态存储类别,就...

  • c primer plus 和 c++ primer plus

    c++ primer plus 第6版:下载链接 备用链接1 备用链接2 c primer plus 第6版:下载...

网友评论

      本文标题:Chapter 2 Note of C++ Primer By

      本文链接:https://www.haomeiwen.com/subject/ewozdttx.html