你发现了奇怪的笔记一(C++)

类型

基本类型:
	数值类型:
		整形:
			1.短整型:short
			2.整形:int
			3.长整型:long
			4.空类型:void
		浮点型:
			1.单精度型:float     有效位数6-7位,单精度数后需写f
			2.双精度型:double    默认15-16位
	字符类型:char
复合类型:
	1.数组:[] 
	2.结构体:struct
	3.共用体:union
	4.枚举类型:enum
	5.类:class
	6.指针类型:*
c语言中没有bool   c语言中用非0为真,以0代表假

cerr

  • cerr不会写入缓冲区。直接输出。

字节

  • 可寻址最小内存块称为“字节”,存储的基本单元称为“字(word)"

变量

  • 变量是一个具有名字,可供操作的存储空间。
  • 变量只能被定义一次,但是可以有多次初始化(extern)

初始化不是赋值

  • 初始化是创建变量时赋予一个初始值。
  • 赋值是把对象当前的值抹除,以一个新值替代

初始化列表

  • {}初始化列表中的值类型必须相同。()则会自动转换
  • long double ld = 3.14; int a{ld};报错
  • long double ld = 3.14; int a{ld};正确

初始化

  • 定义在任何函数体之外的变量初始值都为0
  • string除外。在任何地方初始化都为空串”“

引用和指针

  • 引用必须初始化,初始化绑定后,一直绑定在一起,不可修改绑定

  • 引用初始化类型必须相同(类型不同,初始化时会先创建一个临时变量。称为临时量。引用临时量,修改值,原来的值不会修改,故报错)

  • 两种类型间指针赋值类型必须相同。不能将double类型指针赋给int类型指针

  • NULL 是预处理变量。值为0

    int zero = 0;
    int *pi;
    pi = zero; //错误,不能把int变量直接赋给指针
    pi = 0;	//正确,空指针
    
  • void*类型指针不能被直接操作,因为不知道具体类型,不知道这个对象有些什么操作

  • int *p; int *&r = p; //r是一个对指针引用p的引用

  • 解析类型从离变量最近的修饰符开始。从右到左

const

  • const
const int i = get_size();//正确,运行时初始化
const int j=42;//正确,编译时初始化
const int k;//错误,k是一个未经初始化的--常量
  • const和引用
const int ci=1024;
const int &r1=ci;//正确,引用及其引用对象都是常量
r1 = 42;//错误,r1是对常量的引用
int &r2=ci;//错误,试图让一个非变量引用指向一个常量对象
const int &r3 = 42;//正确,r3是一个常量引用
  • 顶层和底层const

顶层:表示本身是个常量(指向常量的指针)

const double pi = 3.14;
double *ptr = ≺//错误,ptr是一个普通指针
const double *cptr=π//正确,cptr是一个指向double常量的指针
*cptr = 42;//错误

底层:表示指向的对象是一个常量(常量指针)

const int ci=42; const int &r = ci;//用于声明的const都是底层const

对常量对象取地址是一种底层const

int errNumb = 0;
int *const currErr = &errNumb;//currErr将一直指向errNumb
const double pi=3.14;
const doubele *const pip=*pi;//pip是一个指向常量对象的常量指针

constexpr变量

  • constexpr int sz = size(); //只有当size()是一个constexpr函数时,才是一条正确的声明语句。不然报错
  • 指针和constexpr
const int *p=nullptr;//p是一个指向整型常量的指针
constexpr int *q=nullptr;//q是一个指向整数的常量指针
----》constexpr把它所定义的对象置为顶层const

constexpr int *np = nullptr;//指向整数的常量指针。值为空
int j=0;
constexpr int i=42;//i的类型是整型常量
//i和j都必须定义在函数之外
constexpr const int *p=&i;//p是常量指针,指向真相常量i
constexpr int *p1=&j;//p1是常量指针,指向整数j

decltype类型指示符

  • 解引用指针可以得到指针所值的对象,而却还能给这个对象赋值,因此decltype(*p)的结果类型是int&,而非Int
  • decltype((variable))------>双层括号---结果永远是引用
  • 返回类型---》包括顶层const
  • auto---》会忽略顶层const
  • 必须牢记decltype用于某个函数时,它返回函数类型而非指针类型(函数指针),因此需要显示的加上*表示我们需要返回指针,而非函数本身

string

string初始化方式

core 解析
string s1 默认初始化,s1是一个空串
string s2(s1) s2是s1的副本
string s2 = s1 等价于s2(s1)
string s3("value") s3是字面值”value"的副本,除了字面值最后的空字符外
string d3="value" 等价于s3("value")
string s4(n,'c') 把s4初始化为由连续n个字符c组成的串

string操作

方法 解释
os<<s 将s写到输出流os当中,返回os
is>>s 从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s) 从is中读取一行赋给s,返回s
s.empty() s为空返回true,否则返回false
s.size() 返回s中的字符个数,不含最后的空字符,返回类型string::size_type
s[n] 返回s中第n个字符的引用,位置n从0计起
s1+s2 返回s1和s2连接后的结果
s1=s2 用s2的副本代替s1中原来的字符
s1==s2 如果s1和s2中所含的字符串一样,则相等,反之不相等---》大小写敏感
<,<=,>,>= 利用字符在字典中的顺序进行比较,且对字母的大小写敏感

切记

  • 字符串字面值与string是不同的类型
    string str = ("hello"+",")+str2;//错误,不能把字面值直接相加
  • 字面值:不能改变的值,如数字,字符,字符串等等。

cctype函数

  • 字母与数字
函数 判别的字符类型
isalnum(c) 当c是字母或者数字时为真
isalpha(c) 当c是字母时为真
iscntrl(c) 当c是控制字符时为真
isdigit(c) 当c是数字时为真
isgraph(c) 当c不是空格但可以打印时为真
islower(c) 当c是小写字母时为真
isprint(c) 当c是可打印字符时为真(即c是空格或者c具有可视形式)
ispunct(c) 当c是标点符号时为真(即c不是控制字符,数字,字母,可打印空白中的一种)
isspace(c) 当c时空白时为真(即c是空格,横向制表符,纵向制表符,回车符,换行符,进纸符中的一种)
isupper(c) 当c是大写字母时为真
isxdigit(c) 当c是十六进制数字时为真
tolower(c) 如果c是大写字母,输出对应的小写字母;否则原样输出
toupper(c) 如果c是小写字母,输出对应的大写字母;否则原样输出

vector

  • 初始化
vector<int> v1{a,b,c,...}
vector<int> v2={a,b,c,...}
其他和string一样
注意1
vector<string> v1{"hi"};//初始化正确
vector<string> v2("Hi");//错误,不能直接使用字符串字面值构建vector对象
注意2
vector<int> v2(10,1);--》10个1,10个值
vector<int> v2{10,1};--》一个10,一个1,两个值
  • 方法

size():和string一样,返回类型注意一下,也是size_type.当作用域不同,vector::size_type--->不是vector::size_type

empty()

....和string重合---》os<<v;is>>v;不同

v.push_back(t) 向v的尾端插入值为t的元素

迭代器

  • 如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器
  • 迭代器间的距离:类型difference_typed,带符号整数,距离可正可负。string和vector都定义了这个类型

操作

支持:*iter iter->mem ++iter --iter iter1==iter2 iter1!=iter2;

谨记

但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。添加元素,迭代器对象失败,但可以重新获取插入后的迭代器

原文地址:https://www.cnblogs.com/ysjcqs/p/cppnote1.html