C++复习资料

第一章 C++语言概述

  1. Simula67是面向对象语言的鼻祖,最早提出对象的概念。
  2. 面向对象的相关概念:封装(封装体具有隐藏性,安全性,通过通道与外界连接),类(创建对象的样板),对象(传递信息是通过消息实现的),聚合,继承,多态性(重载--函数重载和运算符重载,动态联编)
  3. ?C++是面向对象的,而C是面向过程的,这个是不同的(书上说C++兼容C,也要支持面向过程的程序设计。)
  4. C++对C做了很多的改进:(1)增加了::,new,delete等运算符(2)允许重载(3)加入了引用符号&(4)对变量的说明更加灵活。Ref->P6
  5. 续行符(\)
  6. 先编译,再链接,最后执行。

第二章 数据类型和表达式

  1. 八进制以0为前缀,十六进制以0x或者0X为前缀。

2.2常量和变量

字符常量(用一对单撇号括起来的)。(转义序列表示法)

//转义序列表示法
//以\开头,后面跟上字符的ASCII值,反斜杠表示消除他后面字符的原有含义。 
#include<iostream>
using namespace std;
int main(void){
	char a,b;
	a='\x23';//十六进制表示法,"\xhh" 
	b='\046';//八进制表示法,"\hhh" 
	cout<<a<<"__"<<b<<endl;
	return 0;
} 

运行结果如下:

同时需要注意到:

//转义序列表示法
//以\开头,后面跟上字符的ASCII值,反斜杠表示消除他后面字符的原有含义。 
#include<iostream>
using namespace std;
int main(void){
	char a,b;
	a='\x23';//十六进制表示法,"\xhh" 
	b='4x';//八进制表示法,"\hhh" 
	cout<<a<<"__"<<b<<endl;
	return 0;
} 

当我把变量b中的元素换一下,结果就变成了下面这样:(我感觉是不是跟那个小尾表示法有点像?)


3.字符串常量。(用双撇号括起来的字符序列,又叫做串常量或者字符串)

//注意:字符串常量有连接,复制等功能。

字符串常量和字符常量的区别:

(1)字符串常量由一个一维数组存放,而字符常量是由一个字符型变量存放

(2)字符串常量以'\0'结尾,这个字符也占一个字节。但是字符常量就没有这个。

(3)字符常量具有加法和减法运算,但是字符串常量不具有这个运算。

#include<iostream>
using namespace std;
int main(void){
	char a,b;
	string m,n;
	cin>>a>>b;
	cout<<a+b<<"__"<<a-b<<endl;	
	return 0;
} 

运行结果如下:

2.3字符数组

将一个一维字符数组初始化为一个字符串时,可用如下简捷方式:

#include<iostream>
using namespace std;
int main(void){
	char s2[5]="abcd";//但是注意,这样是不正确的:char s3[5]="abcde" 
	string s5="efdg";//因为对于字符串而言,后面的'\0'是系统自动添加的。这种初始化时越界的 
	char s3[]="heuakj"; 
	cout<<s2<<"__"<<s5<<"__"<<s3<<endl;
	return 0;
} 

运行结果如下:

2.4指针

2.4.1指针

定义指针时要指出该指针的类型,即在指针前冠以*符号。

例子:

	int *pi;//定义一个指针变量,指向变量pi 
	float *pl;
	double *pc;
	int *pa[3];//定义一个指向一维指针数组的指针pa。  
	char (*pa)[3];//定义指向一维数组的指针,它所指向的是一个具有3个char类型元素的数组。 
	double (*pf)();//pf是一个指向函数的指针,该函数的返回值为double。 

指针的赋值:

1.任何一种类型的指针所赋的值都是内存地址值,只是不同类型指针的内存地址值的表示不尽相同。

2.C++语言规定,数组的地址值用数组名来表示,这是一个常量指针。这个常量指针的值是该数组首元素的地址值。

    如何理解常量指针:例如int a[10];a+2是合法的,但是a++是不合法的,因为a++就是a=a+1.这样a的值就改变了,显然不符合规则。

3.函数的地址值可以用该函数的名字来表示,一个指向函数的指针可以用该函数的函数名字来表示。

#include<iostream>
#include<cmath>
using namespace std;//函数的地址值用函数名字表示。 
int fun(int a,int b){
	return a+b;
}
int main(void){
	int (*pf)(int x,int y);//在这里定义一个指向函数的指针。 
	pf=fun;//把fun的值给了pf 
	cout<<pf(2,3); //有种换汤不换药的感觉。 
	return 0;
} 

运行结果如下:

4.指针作为一种特殊的变量,运算是很有限的一般而言,指针所允许的原运算有以下四种:

(1)赋值运算-->变量的地址值,数组名或者一个函数在内存中的入口地址值,指针赋给另一个指针

(2)指针可以加上或者减去一个整数值(其实就是指针的移动)

        例如:int a,*p;a=*(p+2);

  (3)两指针相减

int main(void){
	int a[6]={0,1,2,3,4,5},*p,*q;
	p=a;
	q=a+3;
	cout<<q-p; //两个指针相减就是地址值的相减,体现在元素上就是两指针之间的元素个数-1 
	return 0;
} 

运行结果如下:

理解如下:其中q-p是3,但是两个指针之间有4个元素。

  

(4)两指针可以比较。

2.4.2 指针和数组

(1)一维数组:

        例如int a[10];用下表表示法为a[i],用指针表示法为*(a+i)

(2)二维数组:int b[2][5]

(二维数组可以看作是一维数组,只是一维数组中的元素也还是一维数组。)

        下标表示法b[i][j];

        指针表示法:*(*(b+i)+j)

                                *(b[i]+j)

                                  *(b+i)[j] 

        

2.4.2.1 指针数组

定义:数组元素为指针的数组称为指针数组。(侧重点在数组。)

表示的话是这么表示:

int *pa[3]。

理解:把pa[3]当做了一种符号,可以理解为int *pa[3]==int *pb;这样理解的话就是声明了一个int类型的指针pb.而这个pb是被封装了的,里面是三个元素,都是指针。这样理解就明白了为啥int*pa[3]指的是声明了三个int类型的一维指针,pa是二维指针。

2.4.2.1.1字符指针

字符指针指的是指向字符串的指针。字符指针可用于字符串常量初始化和赋值,这个比字符数组存放字符串更加的方便,例如:

char *p="abcd",*q;
q="mnpq";
#include<iostream>
using namespace std;
int main(void){
	char *s[]={"char","long","int"};
	s[0]="double";
	*(s+1)="float";
	cout<<s[0]<<endl;
	cout<<*(s+1)<<endl;
	cout<<s[2]<<endl;
	cout<<*(*s+2)<<','<<*(s[2]+1)<<endl;
	return 0;
} 

运行结果如下:

2.4.2.2数组指针

定义:指向数组的指针,侧重点在于指针。

理解:int(*pa)[3],由于数组名也是一种指针,所以可以把(*pa)视为b,b是一级指针,b=*pa,即&b=pa,所以pa是指向b的,所以pa是二级指针。

指向一维数组的指针通常用一个二维数组的行地址,即二级指针的地址值给它赋值。

int a[2][3]={1,2,3,4,5,6};//声明并定义了一个二维数组
int (*pa)[3];//声明了指向一维数组的二维指针pa,该数组有三个元素。
pa=a+1;//a是二维指针,pa也是二维指针。

图解如下:

2.5引用

1.引用的概念

1)什么是引用

引用是某个对象或者变量的别名。引用不是变量,本身没有值,也不占内存空间。

引用的值就是被他引用的变量或者对象的值。引用的地址值就是被他引用的变量或者对象的地址值。引用的值将随被引用的变量或者对象的值改变而改变。引用的值的改变也将改变被引用的变量或者对象的值。

2)创建引用的格式如下:

<类型>&<引用名>=<初始值>

参考:c++中引用面试点7连问以及引用真的不分配内存吗 - CPP加油站的文章 - 知乎
https://zhuanlan.zhihu.com/p/384591552

2.6 联合(共用体)

格式:

union <联合名>//用尖括号是因为这个联合名可有可无。

{

        <联合成员说明>

}

union <联合名> <联合变量名>;

        共用体的特点在于所有成员共用一个地址,即共址。共用体的内存大小取决于共用体成员中最大的那个。(对于联合而言,是小尾表示法存储,可以参考网址:大端与小端,大尾与小尾,高尾端与低尾端,主机字节序与网络字节序 - stardsd - 博客园 (cnblogs.com)

        由于

#include<iostream>
using namespace std;
union change{
		char c[20];
		int a;
		int b;
	};
union change un;
int main(void){
	un.a=1;
	un.b=2;
	cout<<un.a<<','<<un.b;
	return 0;
} 

运行结果如下:(不明白)

小尾表示法::

#include<iostream>
using namespace std;
union change{
		char c[2];
		int a;
	};
union change un;
int main(void){
	un.a=16961;//对应的二进制码0100,0010,0100,0001 
	cout<<un.c[0]<<','<<un.c[1];//运用小尾表示法,尾就要放在低地址处 
	return 0;//c[0]存放0100,0001;c[1]存放0100,0010 
} 

运行结果如下:

第三章 预处理和语句

3.1 预处理功能

预处理命令实际上是编译命令,他不是语句,不要用分号结束。

5.1 类的定义

访问权限修饰符:公有的(public)、私有的(private)和保护的(protected);

公有部分:一些操作(即成员函数),是提供给用户的接口功能;

私有部分:一些数据成员,通常用来描述该类中的对象的属性;只有成员函数或者经过特殊说明的函数才可以引用它们。//指针是没有办法直接引用的。

注意事项

①定义类时,只是定义了一种导出的数据类型,并不为类分配存储空间,所以,在定义类中的数据成员时(往往都是私有的),不能对其初始化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值