复习笔记(一)——C++基础
C++与C有什么关系?它们的区别是什么?
① 在C语言中引入了面向对象的思想
②C++是一种混合型的语言,同时支持结构化程序设计和面向对象程序设计方法
③兼容C语言,可不加修改地使用C语言代码
④允许数据抽象,支持封装、继承和多态等特征
目录
- C++标准库
- 关键字
- 数据类型
- 数据类型分类
- 数据类型概述
- bool类型
- 结构体位段
- 强制类型转换
- 域运算符
- 动态分配内存
- new运算符
- delete运算符
- new和malloc区别
- 函数重载
- 带默认形参值的函数
- 内联函数
- 引用类型
- 按引用传递
C++标准库
直接使用标准C中所有库,如以下是常用的标准C函数库头文件:
stdio.h、 stdlib.h、 string.h、 ctype.h
C++编译器都提供有完整的标准库
C++标准库中的几乎所有内容都是在命名空间std中定义的
使用C++标准库将获得非常多的功能
关键字
关键字是系统已经预定义的单词,有专用的定义。这些关键词都是保留字,用户不可再重新定义。
C++区分大小写,关键字全部由小写字母组成。标准C++(ISO14882)定义了74个关键字,具体的C++编译器还会做一些增删
数据类型
数据类型分类
C++中数据有常量和变量之分,它们分别属于以下这些类型
数据类型概述
基本数据类型有4种:整型(int)、实型(float、double)、字符型(char)、逻辑型(bool)
**注意:C语言没有bool型
空类型void:用于显示说明一个函数不返回任何值
构造类型又称为组合类型:是由基本类型按照某种规则组合而成的
指针类型:变量用于存储另一变量的地址,而不能用来存放基本类型的数据
类类型:是体现面向对象程序设计的最基本特征,也是体现C++与C最大的不同之处
bool类型
逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++6.0中为1个字节。
可以当作整数用(true一般为1,false为0)
把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false
结构体位段
C++定义结构体中,可以为其成员定义时指定所占的位数(1个字节为8个位)
#include<stdio.h>
struct Date
{ int year : 12; int month : 12; int day : 16;
};
int main()
{printf("sizeof(struct Date) = %d\n",sizeof(struct Date));return 0;
}
执行结果:
sizeof(struct Date) = 8
强制类型转换
①强制类型转换格式如下:
type(表达式),例如:int(num);
(type)表达式,例如:(int)num;
作用:将表达式强制转换为type类型,但表达式的值及其类型不变
②新增的强制类型转换运算符:
格式:static_cast(表达式)
例如:
double root=3.14;
int value=static_cast<int>(root);
域运算符
C++中增加的作用域标识符 ::
①用于对与局部变量同名的全局变量进行访问
②用于表示类的成员,这将在关于类的一节中详细说明
示例:
#include<stdio.h>int var=1;
void main(void)
{int var=0;printf("var=%d\n",var); //局部变量var=::var; //引用全局变量printf("after var=::var %d\n",var);
}执行结果:
var=0
after var=::var 1
动态分配内存
静态分配内存:在编译时确定了固定的内存地址与内存大小,如:函数里的局部变量、全局变量等。
动态分配内存:由程序控制,运行时主动性的向系统申请所需大小的内存段,并且每次分配到的内存地址不固定。
C++ 可以使用malloc、realloc、calloc和free函数实现,也可以使用运算符new和delete实现。
new运算符
new 运算符 可以用于创建堆空间成功返回首地址,失败返回NULL
语法:指针变量=new 数据类型;
指针变量=new 数据类型[长度];
例如:
int *p; p=new int;
char *pStr=new char[50];
delete运算符
delete运算符 可以用于释放堆空间
语法:delete 指针变量;
delete [] 指针变量;
例如:
delete p;
delete [] pStr;
动态内存分配示例:
#include <stdlib.h>
#include <stdio.h>
int main()
{int * a;int i, num;char ch;printf("Please enter the number of integers: ");scanf("%d",&num);printf("");a = new int [num];if (a == NULL) {printf( "malloc error! exit.\n" );return 1;}for( i = 0; i < num; i ++ ){*(a+i) = i+1;}for (i = 0; i < num; i ++ )printf( "a[%d] = %d\n",i,a[i] );printf("\n");delete [ ] a ;return 0;
}执行结果:
Please enter the number of integers: 3
a[0] = 1
a[1] = 2
a[2] = 3
new和malloc区别
1、属性
new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。
2、参数
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
3、返回类型
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
4、分配失败
new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
5、自定义类型
new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
6、重载
C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。
7、 内存区域
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。
函数重载
C++允许用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强
函数重载又称为函数的多态性
函数重载不同形式:
①形参数量不同
②形参类型不同
③形参的顺序不同
④形参数量和形参类型都不同
调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数
合法的重载例子:
int abs(int i);
long abs(long l);
double abs(double d);
非法的重载例子:
int abs(int i);
long abs(int i);
void abs(int i);
//如果返回类型不同而函数名相同、形参也相同,则是不合法的,编译器会报"语法错误"
函数重载实例:
#include <stdio.h>
int max(int x, int y);
double max(double x, double y);
void main()
{ int a=10, b=20 ,c;double x=10.3, y=10.6, z;c = max(a,b);z = max(x,y);printf("\nc=%d z=%.1f\n",c,z);
}
int max(int x, int y)
{ printf("\nint function"); if(x>y) return x; elsereturn y;
}
double max(double x, double y)
{ printf("\ndouble function"); if(x>y) return x; elsereturn y;
}执行结果
int function
double function:
c=20 z=10.6
带默认形参值的函数
函数声明或者定义的时候,可以给形参赋一些默认值
调用函数时,若没有给出实参,则按指定的默认值进行工作
函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值
默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值。
void func1(int a, double b=4.5, int c=3); //合法
void func1(int a=1, double b, int c=3); //不合法
函数调用时,实参与形参按从左到右的顺序进行匹配
实例:
#include <stdio.h>
double power(double x=10.0, int n=2);
void main()
{ printf("power(3,5)=%.1f\n",power(3,5)); printf("power(3)=%.1f\n",power(3));printf("power()=%.1f\n",power());
}
double power(double x, int n){ int i;double s=1.0;s = x + n;return s;
}执行结果:
power(3,5)=8.0
power(3)=5.0
power()=12.0
带默认形参值的函数的二义性:
重载的函数中如果形参带有默认值时,可能产生二义性
示例:
#include <stdio.h>
int add(int x=5, int y=6);
float add(int x=5, float y=10.0);
void main() { int a; float b; a= add(10,20); b= add(10); printf("a= %d\n" , a); printf("b= %d\n",b);
}
b=add(10)语句产生二义性,可以认为该语句是调用第一个函数,也可以是第二个,因此编译器不能确定调用的是哪一个函数。
内联函数
当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。有些情况下,函数本身功能简单,代码很短,但使用频率却很高,程序频繁调用该函数所花费的时间却很多,从而使得程序执行效率降低。
为了提高效率,一个解决办法就是不使用函数,直接将函数的代码嵌入到程序中。但这个办法也有缺点,一是相同代码重复书写,二是程序可读性往往没有使用函数的好。
为了协调好效率和可读性之间的矛盾,C++提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。
实例:
//读入一行字符串,逐个判断是否为数字字符:
# include <iostream.h>
inline IsNumber(char ch)
{ return ch>='0' && ch<='9'?1:0;
}
void main()
{char ch;cout<<"请在键盘输入一个字母或数字:";while(cin.get(ch), ch!='\n'){if (IsNumber(ch)) cout<<"是数字字符"<<endl;else cout<<"不是数字字符 "<<endl;}
}//因使用频度很高,说明为内联函数。
使用内联函数注意点:
1.递归函数不能定义为内联函数
2.内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。
3.内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。
4.使用inline的修饰时,gcc编译器会根据实际情况,看是否需要内联,太过复杂的函数,编译器是不会进行内联的。而有些简单的函数,就算没有使用inline修饰,编译器也会进行内联。
引用类型
引用是一种特殊的变量,可以认为是一个变量的别名
定义引用的一般格式:类型说明符 &引用名 = 变量名;
例如:
int a=1;
int &b=a;
// b是a的别名,因此a和b是同一个单元
注意:定义引用时一定要初始化,指明该引用变量是谁的别名
对数组只能引用数组元素,不能引用数组(数组名本身为地址)。
不能定义引用的引用(引用也是地址),所以当函数的参数为引用时,引用不能作实参。
按引用传递
引用传递方式是在函数定义时在形参前面加上引用运算符"&"
例如:
swap(int &a,int &b);
按值传递方式容易理解,但形参值的改变不能对实参产生影响
地址传递方式通过形参的改变使相应的实参改变,但程序容易产生错误且难以阅读
引用作为参数对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然
实例:
#include <stdio.h>
void swap(int &x, int &y);
void main()
{int a, b;a = 10;b = 20;swap(a, b);printf("a=%d,b=%d",a,b);
}
void swap(int &x, int &y)
{int temp;temp = x;x = y;y = temp;
}执行结果:
a=20,b=10
注意:引用作参数时,函数的实参与形参在内存中共用存储单元,因此形参的变化会使实参同时变化。
复习笔记(一)——C++基础相关推荐
- 大学物理第十三章复习笔记:波动光学基础
大学物理第十三章:波动光学基础 一.光是电磁波 1.波源,波速,频率 波源:任何振动的电荷或者电荷系都是发射电磁波的源 波速:约等于3.0 × 1 0 8 m / s \times 10^8 m/s ...
- 【复习笔记】电力系统基础
文章目录 第一章 绪论 一.电力系统基本概念 1.电力网.电力系统和动力系统 2.为什么要联成大电网: 3.电力系统的特点 4.对供电系统的要求 5.电能的质量指标 6.电力系统额定电压 7.接地 8 ...
- 大四Java复习笔记之Java基础
2019独角兽企业重金招聘Python工程师标准>>> 一.static和final 学习Java那么久,好像自己就没有怎么用过final,所以对fianl的理解不够.final不但 ...
- 爆肝!css复习笔记(有目录!)
爆肝!css复习笔记 1.基础选择器:标签选择器.类选择器.id 选择器和通配符选择器 2.css字体属性 font-family font-size字体大小 font-weight字体的粗细 fon ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- 计算机二级循环队列知识点,考点!计算机二级考试公共基础知识冲刺复习笔记:栈、队列和循环队列...
小编所收集到的相关计算机二级考试公共基础知识冲刺复习笔记:栈.队列和循环队列的资料 大家要认真阅读哦! 1.栈(Stack)又称堆栈. (1)栈是一种运算受限的线性表,其限制是仅允许在表的一端进行插入 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- 计算机原理考研题库,2022考研853计算机专业基础综合《计算机组成原理》复习笔记及考研真题题库.pdf...
2022考研 853计算机专业基础综合 <计算机组成原理>复习笔记及考 研真题题库 计算机系统概论 一.计算机的分类 1电子模拟计算机 模拟计算机的特点是数值由连续量来表示,运算过程也是连 ...
- 【前端】HTML标签基础复习笔记
不够完美又何妨?万物皆有裂隙,那是光进来的地方. 文章目录 HTML复习笔记 JavaWeb相关概述 HTML概述 HTML语法 基本标签 图片标签 链接 列表标签 块级标签 表格标签 表单标签 HT ...
- 前端JS基础知识复习笔记(1)
珠峰前端JS基础复习笔记(1) 在财务工作中自学了HTML和CSS之后,硬啃了JS高级编程三,实在觉得想要学的透是需要找一位好老师的,于是最近在学习周啸天老师的JS高级编程课,课外需要再补补基础,就回 ...
最新文章
- python银行开户_Python数据挖掘与Stata应用实证寒假工作坊
- Wix安装程序中判断是否安装的.net framwork 4.5
- 服务器上有图片但是app不显示不出来,网络app图片显示不出来的
- 在 Excel 中如何使用宏示例删除列表中的重复项
- [深度学习] 自然语言处理 --- Self-Attention(二) 动画与代码演示
- leetcode —— 面试题 17.08. 马戏团人塔
- java servlet 注册登录,JSP+JavaBean+Servlet实现用户登录与注册
- java添加关闭窗口事件_Java开发网 - 如何给JInternalFrame类的窗口添加关闭事件?...
- pytorch中获取模型参数
- s3c2440定时器简介
- C# 处理应用程序减少内存占用
- Centos升级GLIBC
- 如何理解 图像傅里叶变换的频谱图
- obs,直播文字画面模糊处理
- 用opencv将左右眼3D图片转换为红蓝3D图片
- linux 6.7 远程端口,CentOS6.7安装vncserver及xrdp实现远程桌面
- 怎样在 Linux 命令行中切换用户
- 百度小程序坐拥三大亿级流量入口 如何低成本制作百度小程序?
- opencv 二维码定位
- 用matlab程序表示三角形序列,MATLAB程序举例带注释
热门文章
- 子矩阵的最大累加和问题
- 产品设计认知:如何构建A/B测试系统,其核心功能有哪些?
- Flink从入门到精通100篇(十五)-Flink SQL FileSystem Connector 分区提交与自定义小文件合并策略 ​
- 使用Selenium模拟浏览器,实现自动爬取数据
- 提示MyEclipse Trial Expired,手动获取MyEclipse 注册码
- MC, MCMC, Gibbs采样 原理实现(in R)
- hadoop使用lzo压缩文件笔记
- 深入Python(3): and、or以及and-or
- Hadoop学习之MapReduce(三)
- 机器学习-非监督分类算法之关联规则