第1章 C++初步认识
目录
1.3.11 动态分配 / 撤销内存的运算符 new 和 delete
1.1-1.2 C++简介
最初C++被称为"带类的C",相较于C增加了面向对象的机制
面向对象的机制,是针对较大规模程序提出的
有系统提供的头文件不需要带后缀.h
类:把一组数据和有权调用这些数据的函数封装到一起
类可以体现数据的封装性和信息隐蔽性
被指定为私有的数据或函数只能被本类的成员函数调用,也可以被类外的语句调用(友元类成员除外)。
对象:具有“类”类型特征的变量
1.3 C++对C的扩充
1.3.1 C++的输入输出
字符输出指定所占的列数 ,可以使用控制符setw设置,但是要添加头文件<iomanip>
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a = 6;
cout << "a=" << setw(6) << a << endl;
}
可能遇到的问题及解决方法:无法打开包括文件:“iomanip.h”
1.3.2 用const定义常变量
C语言常用#define命令来定义符号常量,只是进行了“字符置换”,容易出错。
/* #define 定义常量 的弊端 */
#include <iostream>
#include <iomanip>
using namespace std;
#define pi 3.1415
int a = 1;
int b = 2;
#define he a + b //define 后面没有顿号
int main()
{
cout << pi * he * he << endl; // pi*a + b*a + b
cout << pi * (he) *( he) << endl; // pi * (a+b) * (a+ b)
}
C++用const定义长变量,占用内存空间,值不可更改:
const float PI=3.14159;
1.3.3 函数原型声明
C语言,函数调用的位置在函数定义之前,则应在函数调用之前对所调用的函数做声明,调用函数是整型的,可以不进行函数声明。
int max(int x, int y);
//C语言简写形式
//C++不允许
int max();
max();
1.3.4 函数的重载
C语言中,几个不同名的函数实现类似功能,如三个数求最大的数。
C++中,可同一函数名定义多个函数,,这些函数的参数个数与参数类型不同,这就是函数重载。即一个函数名多用。
系统会根据实参的类型找到与之匹配的函数,然后调用。
例1.7 用一个函数求2个整数或3个整数的最大者。(假设某个变量为最值,再更新,代码简洁)
#include <iostream>
using namespace std;
int max(int a, int b)
{
if (a > b) b = a;
return b;
}
int max(int a, int b, int c)
{
if (a > b) b= a; //假设b为最大值,充分利用if 来更新,和每个数来比较
if (c > b) b =c; //代码简洁,选择一个变量为最大值,临时变量,更新后返回,
return b;
}
int main()
{
int a = 18,b =13, c = 14;
int max_2=max(b, c);
int max_3=max(a, b, c);
cout << "max_2=" << max_2 << endl;
cout << "max_3=" << max_3 << endl;
}
1.3.5 函数模板
提出的背景:函数重载虽然实现一个函数名多用,将实现相同或类似功能的函数用同一个函数名来定义,但是任需要定义多个函数。因此提出了函数模板:建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。
凡是函数体相同的函数都能用这个模板来代替。
模板声明 、通用函数定义:
template<typename T> //模板声明,没有分号,会出错
template<typename T> ; template<class T>;//通用函数定义
例1.8 使用模板函数来求各种类似的数值比较(模板声明处没有分号)
#include <iostream>
using namespace std;
template <typename T> //后面没有;,有些教材错写
T max(T a,T b, T c)
{
if (a > b) b= a; //假设b为最大值,充分利用if 来更新,和每个数来比较
if (c > b) b =c; //代码简洁,选择一个变量为最大值,临时变量,更新后返回,
return b;
}
int main()
{
int a = 18,b =13, c = 14;
float e = 11.5, f = 9.5, g = 20.3;
a=max(a, b, c);
e = max(e, g, f); //无关变量重复利用
cout << "max_int=" << a << endl;
cout << "max_float=" << e << endl;
}
1.3.6 有默认参数的函数
给函数的形参赋默认值,可以每个形参都有一个默认值,也可以部分形参指定默认值。
实参和形参的结合是从左向右匹配结合的。
因此,多个形参时,指定默认值的参数必须放在形参表列的最右端!
void f1(float a,int b=0,int c, char d='a'); // xx错误xx
void f2(float a,int c, int b=0,char d='a'); // √√正确√√
注意事项:1)最好函数声明时指定默认值,否则容易混与错误!!以声明为主!
2)一个函数不能同时作为重载函数和有默认值得函数!
1.3.7 变量的引用
引用(reference)就是变量的别名,引用不是一个独立变量,不单独占内存单元.
对一个变量的“引用”的所有操作,实际就是对原来变量的操作。
int a=3,b=4;
int &c=a; //声明c是整型变量的别名
&b= c;//声明b是整型引用c的别名
C++之所以增加“引用”,主要是利用他作为函数参数,以扩充函数传递数据的功能,即"引用形参"。
相当于将实参的地址传给了引用的形参,他们是同一个变量。
#include <iostream>
#include <iomanip> // 使用setw 必须加入该符号
using namespace std;
template <typename T> //后面没有;,有些教材错写
void swap_z(T &a,T &b)
{
T temp=a;
a = b;
b = temp;
}
int main()
{
float a = 1.023;
float b = 15.2;
cout << "a=" <<setw(6)<< a << " b= " << b << endl;
swap_z(a, b); //不需要传地址
cout << "a=" << setw(6) << a << " b= " << b << endl;
}
1.3.8 内置函数(内联函数)
常调用的函数前加 "inline"
1.3.9 作用域运算符
规定:main函数中的局部变量将屏蔽同名的全局变量,可使用作用域运算符“::”,它能输出同名的全局变量。
例 1.16 局部变量和全局变量同名。
#include <iostream>
using namespace std;
float a = 3.1415;
int main()
{
int a = 5;
cout << " a="<<a << endl; //输出局部变量a的值
cout <<" ::a="<< ::a << endl; //输出全局变量a的值
}
1.3.10 字符串变量
#include <string>
string name[5]={"zhang","li","wang","zeng","yu"}
1.3.11 动态分配 / 撤销内存的运算符 new 和 delete
C语言中,使用 malloc 和 free 分配和撤销内存空间。但是malloc必须指定需要开辟的内存的大小。调用形式为 malloc(size). malloc函数返回值一律为 void * 类型,必须强制装换才能使返回指针指向具体的类型
new int; //开辟一个存放整数的空间,返回一个指向整型数据的指针
new int(100); //开辟一个存放整数的空间, 并指定整数的初值为100
C++上机实践:GCC与 Visual C++集成环境,GCC编译系统最接近C++标准