c++primer第五版第一章第二章

第一章

输入输出

#include<iostream>
int main(){
	int v1 = 0, v2 = 0;
	std::cin >> v1 >> v2;
	std::cout <<"v1+v2="<< v1 + v2;//拼接输出用“<<”
	return 0;
}

输出字符串常量

std::cout<<”wdadw”;
std::cout<<endl;//刷新缓冲区
//不是标准库文件用include”xx.h”

控制流

while (std::cin>>v1)//输入非int结束

第二章

基本数据类型

选择标准 数据类型
不可能为负数 无符号数
>int long long
不大的整数 signed char/unsigned char
小数 用double不用float

字符串是char[],末尾有’\0’

变量

一处定义多处使用:声明。

定义分配存储空间,声明则不分配。

extern int i;//使用外部变量

标识符

类型 操作
类名 首字母大写
多个单词组成 第一个首字母小写、第二个单词首字母大写
变量名 小写

引用

定义必须初始化

int i=1;
int &d=i;

指针

类型 定义时必须初始化 是对象吗/可以赋值、拷贝、被指针指向吗 可以指向不同的变量吗
指针 x v v
引用 v x x

指针定义

int i=2;
int *p=&i;
int *p2=p;

也可以这样定义

int i=1;
int *p=nullptr;
p=&i;

解引用

//地址
cout << p2 << endl;//地址
cout << p << endl;//和p2数值一样
//*p获得指向的变量值,可对其修改
cout << *p2 << endl;//2
cout << *p << endl;//2
*p=1;//修改变量i值=1
cout << *p2 << endl;//1
cout << *p << endl;//1

空指针

int *p= nullptr;//nullptr是预处理变量,由编译前的预处理器替换。
int *p= 0;//也可以

void*指针

int i=1;  
void *p=nullptr; 
p=&i;  
cout<<p<<endl;
cout<<*p<<endl;//报错,表达式必须是指向完整对象类型的指针

指针的指针

int i=0;
int *p=&i;
int **p2=&p;//指针的指针

指向指针的引用

int i=0;
int *p=&i;
int *&a=p;//指向指针的引用

extern const

不同文件可以共享

在test.cpp下

#include <iostream>
 extern const int i=1;

在main.cpp下

extern const int i;
cout<<i<<endl;//1

常量引用

只读

int i=1;
const int &i2=i;
//i2=2;//error
const int i=1;
int &i2=i;//error,要定义成常量引用

指向常量的指针(只读、指向可变)

const double pi=3.14;
//double *pa=&pi;//指向变量的指针
const double *pb=&pi;//指向常量的指针
double b=1.1;
pb=&b;//指向可变

常量指针(读写,指向不变)

int a,c=0;
int *const pa=&a;//指针功能:指向不变,读写
*pa=1;
// pa=&c;//error
const int b=0;
const int *const pb=&b;//指针功能:指向不变,只读

constexpr 和常量表达式

const int i=2;//是常量表达式
int a=3;//不是
const修饰过的数据之间的拷贝问题
“=”左边的数据不会导致“=“右边的数
据发生变化就可以拷贝。
#include <iostream>
using namespace std;
/*
*	constexpr指针的初始值,必须为nullptr,0,固定地址。
*	但是函数体内部的变量地址不固定,所以不能指向那些变量。
*	函数体外的变量地址不变。但是函数可以定义函数体外的一类变量,
*	它们地址固定,可以指向它们。如i,j
*/
int i=2;
int j=3;
int main()
{
/*	 常量表达式:编译期就可以计算出结果
*    constexpr 变量:跟const差不多,可以修饰函数,在编译时就能计算出结果。
*   声明constexpr用到的类型,为字面值类型,如算术类型,引用,指针。
*    但是自定义类,IO类,string都不是。   
*/
	constexpr int *p=&i;//顶层const,常量指针,读写,指向不变
	*p=3;
	p=&j;//error 不可改变指向
	constexpr const int *p2=&j;//常量指针+只读
	*p2=4;//error
    return 0;
}

处理类型

类型别名

auto类型说明符

decltype类型指示符

类型别名的两种方法

//method01:
typedef double wages;//wages等价于double
typedef wages base,p*;//p等价于double*
//method02:
using IN=int;

指针、常量和类型别名

//对于符合类型,如指针,
typedef char *pstring;
const pstring cstr=0;//不是简单的替换,而是一种修饰,const修饰pstring,cstr是常量指针
const pstring *ps;//ps是指针,指向一个对象(一个常量指针)

auto类型说明符

//编译器确定类型,必须有初始值
auto item=va;
//一般会忽略顶层const(指向不变),保留底层const
const int ci=i;//顶层const
auto b=ci;//b为int类型
//如果希望变为顶层const,可以这样定义
const auto b2=i;//b2是const int

decltype类型指示符

//只用类型不用值
decltype(f()) sum =x;//f()可以是变量或是表达式
int i=42,*p=&i,&r=i;
decltype(r+0) b;//r是int&,加0,b为int
decltype(*p) c=i;//c是int&
//双括号是引用
decltype((i));//int&
decltype(i);//int

自定义数据结构

定义Sales_data类型

使用Sales_data类

编写自己的头文件

定义Sales_data.h类

#ifndef SALES_DATA_H//如果没有包含,就执行以下
#define SALES_DATA_H
#include "Version_test.h"
#include <string>
struct Sales_data {
	std::string bookNo;
#ifdef IN_CLASS_INITS
	unsigned units_sold = 0;
	double revenue = 0.0;
#else
	unsigned units_sold;  
	double revenue;
#endif
};
#endif

Sales_data.cpp

#include "Sales_data.h"
...
int main(){...}

预处理器

确保头文件多次被包含,还可以正常运行
发布了19 篇原创文章 · 获赞 0 · 访问量 1252

猜你喜欢

转载自blog.csdn.net/qq_35459198/article/details/105316622