第四章 复合类型
一·
数据类型分为内置类型和自定义类型。
内置类型分为基本类型和复合类型。基本类型分为算数类型和void类型。
算数类型分为整值类型和浮点类型。整值类型分为字符类型和布尔类型以及整数类型
自定义类型分为用户自定义和标准库中定义的类型。
1.constexpr对象
例:
constexpr int size = 20; // 20是常量表达式
constexpr int limits = size + 10; // size+10是常量表达式
constexpr int max = length();
//只有length()是一个constexpr函数时,max的声明才正确
constexpr和const对象
constexpr int a = length();
//必须在编译时能计算出length()返回值
const int b = length();
//b的值可以在运行时才获得,之后不改变
2. auto类型说明符
例:auto x = 5; //5是int类型,所以x是int类型
auto size = sizeof(int); //x是表示内存字节数的类型
//具体类型不清楚
auto name = "world"; //name要保存字符串"world"
//具体类型不清楚
cout << "hello, " << name; //此时name的类型是什么并不重要
auto a; //错误:没有初始值
auto r = 1, pi = 3.14; //错误:r和pi推断出的类型不一致
3. decltype类型指示符
decltype(sizeof(int)) size; //size的类型是sizeof(int)结果的类型
const int ci = 0;
decltype(ci) x = 1; //x的类型是const int
decltype(f()) y = sum; //y的类型是函数f()的返回值类型
4. range-for语句
例:
// 累加20以内的素数
int sum = 0;
for(int e : {2, 3, 5, 7, 11, 13, 17, 19})
sum += e;
cout << sum << endl; //输出77
// 将数组的每个元素加倍
int arr[] = {1, 3, 5, 7, 9};
for(auto ele : arr) {
ele = ele * 2;
cout << ele << " ";
} // 输出:2 6 10 14 18
for(auto ele : arr)
cout << ele << " "; // 输出:1 3 5 7 9 ?
二.指针和应用
1.指针
int *pi;
int* pi;
char *pc1, *pc2;
char* pc1, pc2;
char *pc1, pc2;
char* pc1, *pc2;
2.取地址运算符“&”
int ival = 120;
int *pi = &ival;
// pi存放int变量ival的地址
// 或者说pi指向ival
char ch = 'a', *pc = &ch;
// pc指向字符型变量ch
3.空指针
生成空指针的3种方法
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;
4. 通用指针void*
可以持有任何类型的地址值,即通用指针
void* pv = &a;
5. 动态存储空间管理
New:
分配单个对象:new 类型 或者 new 类型(初始值)
分配多个连续存储的对象:new 类型[数组大小]
定位new,在指定位置分配空间:new (指针) 类型;
Delete:
释放new分配的单个对象的delete形式
delete 指针;
释放new分配的数组的delete形式
delete[] 指针;
6.左值引用
引用一般指左值引用
间接操控对象 在程序中引用主要用作函数的参数
引用的定义和初始化
引用由类型标识符和一个取地址符(&)来定义
type& refVariable = leftValue;
引用必须被初始化,初始值是一个有内存地址的对象
7.右值引用
右值引用就是必须绑定到右值的引用
定义和初始化右值引用的形式
类型 &&右值引用变量 = 右值表达式;
右值引用由类型标识符和两个取地址符(&&)定义
右值引用必须被初始化,初始值是右值表达式
不能将右值引用直接绑定到一个左值上
std::move
函数std::move函数返回给定对象的右值引用
标准库
int &&rr1 = 10; //右值引用
8. CV限定词
const限定词
关键字const限定的对象是不可改变的
volatile限定词
关键字volatile限定的对象不能被编译器例行优化
9. const限定指针
指向const对象的指针(非const )
const type *cp; 或者type const *cp;
指向非const对象的const指针
type* const cp = initAddressValue;
指向const对象的const指针
const type* const cp = initAddressValue;
三.:
1.struct 结构体类型名{
成员声明;
};
//定义结构体类型X
struct X {
char c;
int i;
float f;
double d;
};
//定义X类型的变量
X s1, s2;
//通过X变量s1引用成员c
s1.c = 'a';
s1.i = 1;
s1.f = 3.5;
s1.d = 0.7
//通过指针ps引用成员c
X* ps = &s1;
s2.c = ps->c;
2.枚举
enum TrafficLight { red, green, yellow };
3. 数组与指针
int a[10];
//指针访问数组元素
for(int *p = a; p < a+10; p++)
cout << *p;
四.
1. 标准库string类
使用string 类要包含头文件
例:
#include
#include
using namespace std;
int main(){
string s1, s2;
string s3 = "Hello, World!";
string s4("I am ");
s2 = "Today";
s1 = s3 + " " + s4;
s1 += " 5 ";
cout << s1 + s2 + "!" <
2.
String s1 默认初始化,s1是一个空串
String s2(s1) s2是s1的副本
String s2=s1 等价于s2(s1)
String s3(“value”) s3(是字面值“value”的副本,除了字面值最后的空字符外
String s3=”value” 等价于s3(“value”),s3是字面值(“value”),s3是字面值“value”的副本
String s4(n,’c’) 把s4初始化为由连续n个字符c组成的串
isalnum() 如果参数是字母数字,即字母或者数字,函数返回true
isalpha() 如果参数是字母,函数返回true
iscntrl() 如果参数是控制字符,函数返回true
isdigit() 如果参数是数字(0-9),函数返回true
isgraph() 如果参数是除空格之外的打印字符,函数返回true
islower() 如果参数是小写字母,函数返回true
isprint() 如果参数是打印字符(包括空格),函数返回true
ispunct() 如果参数是标点符号,函数返回true
isspace() 如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true
isupper() 如果参数是大写字母,函数返回true
isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true
tolower() 如果参数是大写字符,返回其小写,否则返回该参数
toupper() 如果参数是小写字符,返回其大写,否则返回该参数
五. 标准库类型vector
#include
#include
using namespace std;
int main(){
vector
for(int id = 0; id < 10; id++)
iv[id] = id;
vector
anotherv = iv;
cout<<"size:"<
for(int id = 0; id < 10; id++)
cout<
}
第五章 函数
一 .//算法:n! = 1 * 2 * ... * (n-1) * n
//函数名fact,返回类型int,一个int类型的形参n
int fact(int n)
{ //函数体开始
int ret = 1;
while ( n > 1 ) //求阶乘
ret *= n--;
return ret; //返回结果
} //函数体结束
2. 指针参数传递
传递指针参数,交换两个变量的值
void pswap(int *pv1, int *pv2)
{
int t;
t = *pv1; *pv1 = *pv2; *pv2 = t; //间接访问
}
int main(){
int ival1 = 10, ival2 = 20;
int *p1 = &ival1;
int *p2 = &ival2;
cout << ival1 << " " << ival2 <
pswap(p1,p2);
cout << ival1 << " " << ival2 <
}