CPlusPlusCrashCourse/chap2_types.md

221 lines
4.6 KiB
Markdown
Raw Permalink Normal View History

2020-07-24 20:11:37 +10:00
# Chapter 2 Types
## Fundamental Types
aka **primitive types** or **built-in types**
* **Integer Types** (`int`)
* **literal** (hardcoded value in program)
* binary: with prefix `0b`
* octal: `O`
* decimal: default
* hexadecimal `0x`
* e.g. refer to [listing2-1.cpp](src/chap2/listing2-1.cpp)
* **Floating-Point Types**
* **Floating-Point Literals**
## User-Defined Types
3 broad categories:
1. **Enumerations (枚举)**
2. **Class (类)**
3. **Unions (共同体)**
### Enumerations
Delaring enumeration:
* start with `enum` followed by type name + a list of values it takes.
* values are alphanumeric strings.
* Values are integer under the hood, allow us to write safer.
* enum 语句示例实际上并没有创建任何变量,只是定义数据类型。
```cpp
enum class Race {
Dinan,
Teklan,
Ivyn
};
```
After declare, we can initiate & use it.
Initialize an enum variable: use name of type followed by `::` + desired values
```cpp
Race langobard_race = Race::Aidan;
```
#### Switch Statements
Enum often used with switch statement
e.g. refer to [listing2-15.cpp](src/chap2/listing2-15.cpp)
### Plain-Old-Data Classes
* **Classes** are user-defined types that contain data and functions.
* Simplest kind of classes are **plain-old-data classes (PODs)**
* PODs are simple containers.
* POD construction: keyword `struct` + POD's name
* i.e. `struct` in C language
Define POD:
```cpp
struct Book {
char name[256];
int year;
int pages;
bool hardcover;
};
```
Declare, initialize, use as shown in [listing2-16.cpp](src/chap2/listing2-16.cpp)
### Unions
Unions is similar as POD, but puts all of its members in the same place. It's like an interpretation of a block of memory.
Define a union, like struct.
```cpp
union Variant {
char string[10];
int integer;
double floating_point;
};
```
* union `Variant` can be interpreted as `char[10]`, an `int` or `double`. It takes memory of largest member
Declare, initialize, use as shown in [listing2-18.cpp](src/chap2/listing2-18.cpp)
* Problem of Union: When you try to interpret v as an old value, it failed, as old variable is gone.
## Fully Featured C++ Classes
POD classes only contain data members. Classes can be used to *encapsulate* data and methods.
### Methods
**Methods** = member functions, create connection among a class, its data. Methods have access to all class's members
Defining class method e.g.:
```cpp
struct ClockOfTheLongNow{
void add_year() {
year++;
}
int year;
};
```
### Access Controls
* **Access controls** restrict class-member access.
* 2 major access controls: `public` & `private`
* Anyone can access a public member, but only a class can access private members. All `struct` members are public by default
#### The `class` Keyword
Replace `struct` keyword with `class`, which declare members `private` by default (i.e. change default access controls).
To make it method public via:
```cpp
class ClockOfTheLongNow {
int year;
public:
void add_year() {
//
}
bool set_year(int new_year) {
//
}
int get_year() {
}
};
```
There are no difference btw `struct` & `class`, only matter of style.
#### Initializing Members
### Constructors
* Constructors are special methods with special declaration.
* Constructors declarations don't state a return type
* Constructors has same name as class
```cpp
#include <cstdio>
struct ClockOfTheLongNow { // Constructor takes no arguments
ClockOfTheLongNow() {
year = 2019; // Set value in initialization as default
}
}
int main() {
ClockOfTheLongNow clock;
printf("Default year: %d", clock.get_year());
}
```
* We can create multiple constructor for initializiton, as shown below
```cpp
#include <cstdio>
struct ClockOfTheLongNow {
ClockOfTheLongNow(int year_in) { // Define a constructor with argument
if (!set_year(year_in)) {
year = 2019;
}
}
};
int main() {
ClockOfTheLongNow clock{2020}; // initialization with value
printf("Year: %d", clock.get_year());
}
```
### Initialization
**Object initialization** or just **initialization**, is the way to bring objects to life.
Here explain the initialization in simple way.
#### Initializing a Fundamental Type to Zero
```cpp
int a = 0; // initialization to 0
int b{}; // initialization to 0
int c = {};
int d;
```
First 3 are reliable, while last
#### Initializing a Fundamental Type to an Arbitrary Value
#### Initializing PODs
#### Initializing PODs to Arbitrary Values
#### Initializing Arrays
#### Full Featured Classes
#### Narrowing Conversions
#### Brace Youself
### Destructor