文章目录
第一章
输入输出
#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=π//指向变量的指针
const double *pb=π//指向常量的指针
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(){...}
预处理器
确保头文件多次被包含,还可以正常运行