c++学习笔记(自用)

https://blog.csdn.net/czc1997/article/details/81254971?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163815137516780269867060%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163815137516780269867060&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-81254971.first_rank_v2_pc_rank_v29&utm_term=c%2B%2B%E5%92%8Cc%E8%AF%AD%E8%A8%80%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187
1.cout直接没有空格
2.cout的输出和printf的区别是什么
3.cin的输入只能以回车为结束吗,与scanf的区别在这里插入图片描述

4.int main()函数后面加return 0的必要性,不加会报错吗
5.循环语句中的cin在这里插入图片描述
在这里插入图片描述
回车是结束符,那么空格为什么能区分数字呢?输入为什么是单个数字而不是3456这个数呢?
空格的分段作用getline的作用?
6.C++类的定义和C中数组有什么异同?
7.类中的对象在声明过后就不用加前缀了吗?使用时会不会与int 定义的变量产生冲突?
8.在这里插入图片描述
在这里插入图片描述
9.类和数组的区别是什么?
*对于类和数组,调用他们都要进行说明(即命名),但是在调用类的时候一定要进行include的说明
*就针对sales_items这个类而言,对我定义的一个items是一个类,它包含了类所有的信息,以及他成员之间既定的规则,而数组往往只指向数组的第一个数,对其成员的调用往往通过指针。
*类与类可以进行相加,但必须满足一定的规则,如sales_items中ISBN号要相同才能相加
11.类和结构体的区别
https://blog.csdn.net/qq_40280582/article/details/80739873?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163815612516780274143625%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163815612516780274143625&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-80739873.first_rank_v2_pc_rank_v29&utm_term=%E7%B1%BB%E5%92%8C%E7%BB%93%E6%9E%84%E4%BD%93&spm=1018.2226.3001.4187
10.在这个例子中 输出的东西是什么?为什么多了一个数据?在这里插入图片描述
11.一个项目中有多个cpp时,如果存在多个main函数,则vs编译时会报错,所以当我们想要运行其中一个cpp时,先要将其他的cpp的属性改成“从生成中排除”
12.练习1.22启发
*c++中不断输入数据的方法依旧是循环,但是格式与c有差异,其主要原因是c中输入通过scanf来实现,而scanf实际是通过查询a的地址来改变a的值,所以该语句不能放在循环条件中,所以程序更加复杂在这里插入图片描述

不过在c中,,似乎也可以通过一些办法,,实现形如while(scanf)的语言,这个就留给以后讨论。
*本题给的参考代码只能在输入错误的isbn时停止并输出结果,可以进行适当改进,来达到用户自己决定何时输出结果。(书上的while语句少了个{},导致运行不正确,应指出。)
首要解决的问题是,while(std::cin>>trans)中,括号中的值是什么,什么时候才能跳出循环。

13.在这里插入图片描述
实参列表是什么?这里的isbn为什么不接受参数?
14.初始化string对象的方法
15.初始化和赋值的区别
在这里插入图片描述
花括号的优势?
16.哪些地方的数值不初始化会报错?
在这里插入图片描述
函内=奇异值;函外=0
在这里插入图片描述
17.声明和定义的区别
声明意味着在某处已经存在了一个变量,此处只是使用了它。
定义意味着一个新的变量,如果某处也存在这个变量,就会报错。
18.引用、指针、宏定义的区别
*指针加地址是否就是引用?
*比较下面程序
//refval无法实时跟踪ival
int refval;
int ival=1;
refval=ival;
refval=2;
//引用未初始化,报错
int &refval;
int ival=1;
refval=ival;
//引用定义,正确
int ival=1;
int &refval=ival;
refval=2;
//用指针实现,正确
int ival=1;
int *p=&ival
&p=2;
*是否有其他的形式来实现引用所实现的功能?
一般而言 int &a=1;是错误的,但是也有特例,看20的总结。
19.指针初始化
在这里插入图片描述
正确
在这里插入图片描述
错误

*是否可以理解为:指针的初始化必须在其定义时进行?
答:并不是,上述程序错误的地方是用变量去赋值指正,如果用一个数值去进行赋值,就不会报错,如:
在这里插入图片描述
这里要注意区分比较指针的赋值和const赋值的区别。(const赋值可以用变量进行赋值)
20.const
*可以定义一个数是const变量,如:
const int a=10;
那么这个a作为一个常量是不能被赋值的,
a=1; //会报错
*可以定义一个声明 如:
extern const a;
*可以定义一个const引用,这里要格外注意:const的引用可以分为两类
一、const对const的引用,如
const int a=1;
const int &b=a;
在这种情况下,b就代表着a,并且a和b都是常量,不能被赋值
a=1;//报错
b=1;//报错
二、const对非常量的引用,如
int a=1;
const int &b=a;
程序是正确的,和变量类型以及指针不同,const的定义不用与前者一致。
这个程序的结果是:a是变量,而b代表的a是常量,即如果想通过b来改变a的值,那是不被允许的。
a=1;//正确
b=1;//错误
三、常量对const的引用
const int ci=1;
int &a=ci;//报错,试图用一个变量引用常量
总结:对于引用,const只能被加不能被除去。
在这里特别注意一点的是,
const int &a=1;//是正确的。
*const指针
const指针和const引用的异同:
同:从概念上看,指针和引用的作用都是指向某个变量或常量,所以对他们的const的使用也遵循相同的规律,即前面说的const只能被加不能被除去原则。
异:在大规则不变得前提下,指针定义时,多了一个const,即最多有两个const,在这里插入图片描述
其中第一个const与引用的规则相对应,而第二个const则说明指针的不变性。从原理上讲,第一个const意味着通过pi指针指向的值不能改变,第二个const意味着pi指针的地址不能变
21.
在这里插入图片描述
在这里插入图片描述
语句是错误的,因为凡是带const的定义,一定要初始化。
在这里插入图片描述
语句是合法的,思考为什么?

总结一下需要初始化的量:
指针(区内指针如果不初始化容易引起不易被发现的错误)
所有带const的量(其中,出去一个特殊情况: const int *p;这一句话中,由于p未指向任何量,且其自身不是常量,所以合法!)
auto定义的变量
在函数里的整型变量。
22.顶层const和底层const的区分:除引用和指针,均是顶层const,引用是底层const,指针两种都有。
23.处理类型:
*类型别名的使用中遇到指针经常出现的错误!
**在这里插入图片描述
24.include 的作用?为什么写std::string时不需要string库?
25.头文件保护符:防止头文件多次编译而导致效率下降。
26.关于输入结束标记

*输入流的缓存区原理(https://blog.csdn.net/kinlore/article/details/83381060?ops_request_misc=&request_id=&biz_id=102&utm_term=c++%E7%BB%93%E6%9D%9F%E6%A0%87%E8%AE%B0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-83381060.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187)

*对int和string的结束条件进行区分
*理解Ctrl+z和Ctrl+d的工作原理,试运行book 3.2.2_2.cpp,输入任意字符加上Ctrl+z后回车,看看会发生什么(https://blog.csdn.net/imkelt/article/details/51973711?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163841382616780264038400%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163841382616780264038400&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-4-51973711.first_rank_v2_pc_rank_v29&utm_term=%E6%96%87%E4%BB%B6%E7%BB%93%E6%9D%9F%E6%A0%87%E8%AE%B0&spm=1018.2226.3001.4187)
*进一步思考,如果用循环区记录一个文件中的字符串,怎么写判断语句,使其在字符串结束时自动结束循环呢?(文件中自然是没有Ctrl+z的)
*书上给的一种思路在这里插入图片描述
用if语句的break来替代用户手动输入Ctrl+z,增加了用户的使用体感。

27.book 3.2.2_2.cpp中,在这里插入图片描述

如果输入aa aa,理论上应该输出的是aa
但是实际上输出的是在这里插入图片描述
为什么?输入aa aaa aaaa结果呢?
目前的解释(纯猜测,待证实):键盘输入的内容在缓存区,真正输入到s中是回车后进行判断,而cin的判定规则是遇到/0就结束,所以缓存区的内容不能一次输入完,所以多次进行
简单总结一下,对string,输入语句cin和getline都是等待输入为回车是进行对缓存区的刷新,不同的是cin只提取到/0(即空格)之前的内容,而getline提取所有内容,并把回车键一起提取,只是最后丢弃了回车键。而cin没有
28.对string的操作总结(两个s之间和s内的操作)
*string的长度,用.size()表示,其类型为size_type,无符号数,不能与int进行比较
*string之间的比较(相同比长度,不同比首字母)
*string相加与字面值相加(规则:从左往右判断)
*string中所有字符处理 for(auto c : str)或者for (auto &c:str),前者只是将str中的单个字符赋值给了C,不改变数值,只进行判断或者输出,后者则为引用,可以改变其值。
*string中的部分字符处理 下标的使用。这里的下表跟数组的下标很类似,但是有几点需要区分,
首先,string的下标中的数为size_type型,所以当我们要对他进行加减操作时,不能用int的变量,而应该用size_type的变量,通常的做法为在这里插入图片描述
,注意,[ ]里如果是一个字面值,如[1],那么编译时会自动将1认为是size_type型,而不需要任何操作。
其次,对string使用下标时,必须检验两件事:
str []中的数比str.size()小,例如:若str是空字符串,则str [0]也是不被允许都
[]中的数必须是正数。
29.vector与数组的区别?
数组里能写字符串吗?

30.vector v{10,“hi”} 初始化代表什么?
特别注意的一点是,vector后面跟的类型是用<>标记的,而不是()。
31.迭代器之于容器=指针之于数组和字符串?
在c中对数组的访问的两种方式,一种是下标,一种是用指针指向它的第一个数组的地址,然后解引用。
在c++中,对类访问的两种方式,一种是下标,一种是迭代器(e(end)迭代器和b(begin)迭代器),然后解引用。当然,e迭代器不指向任何元素,自然不能解引用→思考:e迭代器有什么用?

32.在这里插入图片描述
33.普通for循环和范围for循环的区别,在对容器进行操作时,都有什么局限性?
范围for循环不能总途停下,他只是一个泛泛的操作
34.
在这里插入图片描述

在这里插入图片描述
35.看book 3.3.3_ex3.20.cpp,反复研究问题出在哪里
36.*区分string、vector和数组定义字符串时的区别:
string str;
string str[10]; //尤其这两个,注意比较区分
vector file;
*vector的优势:
数组空间的规定的,vector可以扩展
数组初始化时不能v1=v2这样赋值,但是vector可以

*数组定义时一定要定义其大小吗?是的,两种定义大小的方式:
int a[3]; or int a[]={a,b,c} 均表示含有三个空间的数组;
*字符数组定义时的特殊性。
体现在其可以通过字符串初始化,但是末尾自动补’0’,但如果给定了数组空间,且字符串占满了空间,则不能补’0’,系统报错。如:在这里插入图片描述

38.数组的定义问题,看下面这两个语句:
int *p[10]; //一个存放是个指针的数组
int (*p)[10]=&arr; //一个指针,指向整形数组 //这一句话将在39进行进一步分析
int(&p)[10]=arr; //一个引用,引用整形数组
int *(*p)[10]=&arr;//一个指针,指向存放指针的数组
总结:

39.int (*p)[10]=&arr; //一个指针,指向整形数组,此时int arr[9]会报错。如果单纯的写int(*p)[10],而不去赋值,则p指向哪里?这句话有意义吗?试比较int arr[10]; int *p=arr;和int (*p)[10]=&arr;的区别
运行下面的程序
在这里插入图片描述
输出结果为
在这里插入图片描述
可见在定义时,p指向了arr数组第一个数的地址,所以解引用后,*p是arr第一个数的地址而非第一个数,书上p102的例子出问题了!
应改成int (*p)[10]=arr; 才能与 int arr[10]; int *p=arr;等价。

猜你喜欢

转载自blog.csdn.net/general_zxc/article/details/120948888