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. 大学物理第十三章复习笔记:波动光学基础

    大学物理第十三章:波动光学基础 一.光是电磁波 1.波源,波速,频率 波源:任何振动的电荷或者电荷系都是发射电磁波的源 波速:约等于3.0 × 1 0 8 m / s \times 10^8 m/s ...

  2. 【复习笔记】电力系统基础

    文章目录 第一章 绪论 一.电力系统基本概念 1.电力网.电力系统和动力系统 2.为什么要联成大电网: 3.电力系统的特点 4.对供电系统的要求 5.电能的质量指标 6.电力系统额定电压 7.接地 8 ...

  3. 大四Java复习笔记之Java基础

    2019独角兽企业重金招聘Python工程师标准>>> 一.static和final 学习Java那么久,好像自己就没有怎么用过final,所以对fianl的理解不够.final不但 ...

  4. 爆肝!css复习笔记(有目录!)

    爆肝!css复习笔记 1.基础选择器:标签选择器.类选择器.id 选择器和通配符选择器 2.css字体属性 font-family font-size字体大小 font-weight字体的粗细 fon ...

  5. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  6. 计算机二级循环队列知识点,考点!计算机二级考试公共基础知识冲刺复习笔记:栈、队列和循环队列...

    小编所收集到的相关计算机二级考试公共基础知识冲刺复习笔记:栈.队列和循环队列的资料 大家要认真阅读哦! 1.栈(Stack)又称堆栈. (1)栈是一种运算受限的线性表,其限制是仅允许在表的一端进行插入 ...

  7. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  8. 计算机原理考研题库,2022考研853计算机专业基础综合《计算机组成原理》复习笔记及考研真题题库.pdf...

    2022考研 853计算机专业基础综合 <计算机组成原理>复习笔记及考 研真题题库 计算机系统概论 一.计算机的分类 1电子模拟计算机 模拟计算机的特点是数值由连续量来表示,运算过程也是连 ...

  9. 【前端】HTML标签基础复习笔记

    不够完美又何妨?万物皆有裂隙,那是光进来的地方. 文章目录 HTML复习笔记 JavaWeb相关概述 HTML概述 HTML语法 基本标签 图片标签 链接 列表标签 块级标签 表格标签 表单标签 HT ...

  10. 前端JS基础知识复习笔记(1)

    珠峰前端JS基础复习笔记(1) 在财务工作中自学了HTML和CSS之后,硬啃了JS高级编程三,实在觉得想要学的透是需要找一位好老师的,于是最近在学习周啸天老师的JS高级编程课,课外需要再补补基础,就回 ...

最新文章

  1. python银行开户_Python数据挖掘与Stata应用实证寒假工作坊
  2. Wix安装程序中判断是否安装的.net framwork 4.5
  3. 服务器上有图片但是app不显示不出来,网络app图片显示不出来的
  4. 在 Excel 中如何使用宏示例删除列表中的重复项
  5. [深度学习] 自然语言处理 --- Self-Attention(二) 动画与代码演示
  6. leetcode —— 面试题 17.08. 马戏团人塔
  7. java servlet 注册登录,JSP+JavaBean+Servlet实现用户登录与注册
  8. java添加关闭窗口事件_Java开发网 - 如何给JInternalFrame类的窗口添加关闭事件?...
  9. pytorch中获取模型参数
  10. s3c2440定时器简介
  11. C# 处理应用程序减少内存占用
  12. Centos升级GLIBC
  13. 如何理解 图像傅里叶变换的频谱图
  14. obs,直播文字画面模糊处理
  15. 用opencv将左右眼3D图片转换为红蓝3D图片
  16. linux 6.7 远程端口,CentOS6.7安装vncserver及xrdp实现远程桌面
  17. 怎样在 Linux 命令行中切换用户
  18. 百度小程序坐拥三大亿级流量入口 如何低成本制作百度小程序?
  19. opencv 二维码定位
  20. 用matlab程序表示三角形序列,MATLAB程序举例带注释

热门文章

  1. 子矩阵的最大累加和问题
  2. 产品设计认知:如何构建A/B测试系统,其核心功能有哪些?
  3. Flink从入门到精通100篇(十五)-Flink SQL FileSystem Connector 分区提交与自定义小文件合并策略 ​
  4. 使用Selenium模拟浏览器,实现自动爬取数据
  5. 提示MyEclipse Trial Expired,手动获取MyEclipse 注册码
  6. MC, MCMC, Gibbs采样 原理实现(in R)
  7. hadoop使用lzo压缩文件笔记
  8. 深入Python(3): and、or以及and-or
  9. Hadoop学习之MapReduce(三)
  10. 机器学习-非监督分类算法之关联规则