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 const
s.
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 const
sin 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.
网友评论