第二章 从C到C++
C++语言对C语言最主要的扩充是引入了面向对象的概念及相应的处理机制
c++兼顾了C语言中的内容,在程序结构上与C语言相同,只是增加了类和对象
2.1 c++程序基本组成
c++编写的语言由函数+类组成
。
。
。
。
。
。
感觉这部分内容不需要死记硬背,理解就好了。只有一些小知识点要注意一下,那我就不那么正式地写了,就写一些易忘的东西吧!
在iostream文件中定义的所有变量、函数等都位于名字空间std中
c++提供名字空间(namespace)* 来防止命名的冲突
函数由语句构成,注意大小写
2.2简单的输入输出
c++本身没有定义输入输出操作,而是由I\O流类库提供的
输出操作又称插入操作
控制符endl用来换行,与“\n”等价
2.3指针与引用
2.3.1指针
指针是一种特殊的对象,指针的类型是它所指对象的类型,它的值是它所指对象的地址值,它的内容是它所指对象的值。
指针不仅可以在任何需要的时候指向动态分配的对象,而且还可以用于对象的共存存取。
1.指针的值和类型
指针具有一般对象的三要素:名字、类型和值
不同类型的指针被分配的内存单元的大小是相同的。
通过指针可以间接获得它所指向的对象的值
2.3.2引用
定义:给对象取一个别名,使用该别名可以存取该对象。
注意点:
- 建立引用时,必须要用某个对象对它初始化
- 引用在初始化被绑定到某个对象上后,将只能永远绑定到这个对象
- 没有空引用
2.4函数
一些碎知识点:
- 函数的使用是通过函数的调用实现的
- 不管函数定义是否有参数,都可以用两种形式调用:函数语句(可以无返回值)或函数表达式(必须有返回值
- 函数原型标识函数的返回类型,同时也标识该函数参数的个数与类型
- 如果函数定义出现在程序第一次调用之前,则不需要函数原型。这时,函数定义就作为函数原型。
举个栗子吧:
#include<iostream>
using namespace std;
int sum(int m,int n); //这个就是函数原型啦
int main()
{
int a,b,c;
cin>>a>>b;
c=sum(a,b);//这个是函数调用中的函数表示式形式,它必须有返回值哦
cout<<c<<endl;
return 0;
}
int sum(int a,int b)//这个是函数定义!!
{
return x+y;
}
如果函数具有返回值,在函数执行return语句时,将创建一个临时对象临时存放函数的返回值,该对象在返回调用后被撤销。该对象是无名的,又称匿名对象。
- c++的参数传递机制:值传递和引用传递
- 值传递数值的传递是单向的
- 引用传递数值的传递时双向的
C++引用的用途: - 方便函数间数据的传递
- 用于返回引用的函数(它的意思是是返回值是引用),就是引用返回,这时,返回值不再复制到临时存储空间,甚至连return 语句所用的存储单元对调用者而言都是可以访问的。(也就是不用担心匿名对象的意思啦)
关于引用返回来举个例子撒
定义一个函数,返回两数较大值的引用
#include<iostream>
using namespace std;
int maxab;
int & maxRef(int x,int ,y)//引用作为函数的返回值时,必须在定义函数时在函数名前添加&,&说明返回的是maxab的引用,换句话说就是返回maxab本身
{
if(x>y) maxab=x;
else maxab=y;
return maxab;
}
int main()
{
int a,b;
cin>>a>>b;
cout<<maxRef(a,b)<<endl;
return 0;
}
程序分析:函数返回引用需要依托于一个对象,因为引用返回的函数返回的是一个实际单元,所以必须保证函数返回时该单元仍有效,即返回对象是非局部对象或静止对象
引用返回的主要目的是为了将该函数用在赋值运算符的左边。
下面是 内联函数和重载函数 啦!
1.内联函数(内嵌函数)
使用inline关键字声明的函数(我到网上搜了一下,函数声明就是函数原型)
主要解决程序的运行效率
【解释(虽然这个我也没看懂😔):函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作都需要一些空间和时间开销。对于经常使用的简单函数,其时间开销可能让人不可接受。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换进而减少了时间开销】(反正知道内联函数可以提高程序运行效率就成啦)
内联函数的特殊性仅在函数调用的处理上。
一些注意点:
- 递归函数不能定义为内联函数
- 内联函数一般不适合于含有switch和while等复杂的结构且只有1~5条语句的小函数,否则编译系统将该函数视为普通函数
- 对内联函数不能进行异常接口声明
2.重载函数
对具有相似行为而数据类型或数据个数不同的操作提供一个通用的名称。
编译系统将根据函数参数的类型和个数来判断使用哪一个函数,体现了多态性。
c++要求重载的函数具有不同的签名
- 函数名(相同)
- 参数的个数,数据类型,顺序(不同)
最后最后,就是new和delete运算符了,终于要结束啦,复习好累啊
这一节没啥重要的知识点
c++使用new,new[],delete,delete[]运算符来进行动态内存分配与释放
用法如下:
new int;//请求一个int的存储空间
p=new int[50];//请求分配50个int 类型单元,如果new成功分配了该数组,则第一个单元的地址将保存到p中。
补充一下其他的C++特性
符号常量const,可以用在类型说明符的前后。
c++提供string 类型来代替C语言的以Null结尾的char 类型数组