C++程序设计
作者:清村常争
撰稿时间:2015年11月23日星期一
第1章 C++初步认识
1.1 C++的输入输出流
cout<< “a=” << setw(6) << a << endl; // setw()输出所占列数
inta; float b; cin >> a >> b;
1.2 const定义常变量
const修饰变量、函数,其值不能改变,取代了#define
const与static,void f()const {…} //说明f()函数体中的数据不能被改变
const的成员变量只能在构造函数的参数初始化列表中初始化
1.3 函数原型声明
函数定义前,先声明函数。
1.4 函数的重载
建立多个使用相同的函数名,但函数中的参数个数、参数类型或参数顺序必须至少有一种不同的函数,函数返回值的类型无关。用于不同函数,但函数功能相近时。
1.5 函数模板
建立一个通用函数,其函数类型、形参类型不具体指定,但函数参数个数、函数体必须相同。如:
//定义max函数模板
template < typename T1 , typename T2>
T1 max( T2 a , T2 b)
{
…
}
//调用
inta1 = 1, b1 = 2, c1 = 3;
floata1 = 1.1, b1 = 2.2, c1 = 3.3;
a = max(a1, b1,c1);
b = max(a2, b2,c2);
1.6 有默认参数的函数
在函数声明时,给函数的参数赋初值,函数定义时不能有默认参数,且不能与函数重载一起使用。如:void f(float a, int b = 0, int c, char d = ‘a’);
1.7 变量的引用 &
在C++中的引用是给变量起别名,原变量与引用变量使用同一个地址内存,传递方式是地址传递,弥补C语言中只有值形参(形参实参、指针),而无变量形参。使用变量时不带&,只在定义引用时用&。(引用也是一种指针类型)
int a; voidswap(int &a , int &b);
int &b =a; //a与b完全相同 swap(i , j); //i与a、j与b完全相同
const与&引用共同使用,作用函数形参,可以减少数据大小,简化书写。
1.8 内置函数 inline
内联函数(内嵌函数),在x.h文件中的函数声明前加inline,且在x.h文件中定义函数的body,x.cpp没有该函数,系统会自动将inline修饰的函数实体代替程序中的函数调用部分的代码。通常在5个语句以下、频繁调用时使用,不能包括循环等复杂语句。因为函数调用时需要进出堆栈,较耗时。
优点:节约运行时间;缺点:增加目前程序长度。
1.9 作用域运算符 ::
类后跟的是“::”,而对象后使用“.”,如:B::B ,a.show();
floata = 13.5;
intmain()
{
int a = 5;
cout << a << endl; //局部变量a = 5
cout << ::a << endl; //全局变量a = 13.5
}
1.10 字符串变量
#include<string> //strcat() strcmp() strcpy()
string str1 =“China”;
1.11 动态分配/撤销内存的运算符new/delete
new动态分配内存。相当于C语言中的malloc函数,float *p =new float(3.141563);
delete撤销内存。相当于C语言中的free函数,deletep; delete [] array;
new+ 类:分配空间,后调用构造函数,返回地址;
delete+ 类:调用析构函数,后释放空间。
deleteq与delete q[]区别:student *q = new student[10];使用delete q,只会调用一次析构函数,而后收回所有空间;使用delete q[],会调用十次析构函数,而后收回所有空间。使用了new后必须使用delete,new出来的对象一定是指针类变量,因为返回值是地址。
1.12 概念区别
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
变量声明:用于向程序表明变量的类型和名字。
定义也是声明,extern声明不是定义
new: 在堆上分配空间; 在分配的空间上调用对象的构造函数。
代码区 (code area): 存放程序
全局(静态)区 (data area): 全局变量、static变量、常量。
堆区 (heap area): 动态内存分配new/malloc,链表管理方式
栈区 (stack area): 系统自动分配,空间小,速度快
第2章 类和对象的特性
面对对象程序设计:对象、封装、抽象、继承、多态。
类是对象的抽象,对象是类的具体实例;类是对象的模板。
class与struct区别:class默认是private,struct默认是public。
this指针指向本对象。
第3章 类和对象的使用
使用初始化列表初始化类中所有的成员变量,不能再构造函数体中,因为程序更快,且按照声明的顺序进行初始化,初始化列表只能对非静态的成员变量进行初始化,可以在子类的初始化列表中初始化父类继承的成员变量。
不要使用defaultargument函数参数的默认幅值 void f(int i, int j = 0); //.h中
A a(1,2); //主函数
A::A(intn, intm) :width(n), length(m){ } //cpp文件,将1赋值给n,n赋值给width
A(int n, int m); //h文件
构造函数:与类名一样的函数,没有返回值,作用是帮组初始化类中的成员变量,当对象被定义(类的对象在内存中创建)时,调用构造函数。
析构函数:在类名前加“~”的函数,当对象被消灭(定义的类的对象在内存中被收回)时,被调用,不能有参数,
{
A a(2); //调用构造函数A(int i){…},将2传给构造函数,初始化成员变量。
…
} //调用析构函数
先构造的对象后析构,后构造的对象先析构:栈
Why有两个构造函数?函数重载,为同一个函数提供不同功能,构造函数参数是缺省的。Box box1; //调用默认构造函数 Box box2(); //调用非默认构造函数;声明中有默认参数,定义中也有,以声明为准。
static修饰的类的成员变量,在x.h中被声明staticint a;,一定要在x.c中进行定义int A ::a;,其他地方访问时,可用A::a,静态成员变量只能在类体外进行初始化。静态成员变量,指的是在同一类中各对象共享一个static的成员变量A::volume();静态成员函数,只能访问静态成员变量,无this->XX。
在本类中用friend声明的全局函数(友元类)、别的类的函数(友元类)、别的类(友元类),这些函数与类可访问本类中的私有变量。
类模板:是类的抽象
//定义Compare类模板,虚拟类型名为T1, T2
template < class T1,class T2>
class Compare
{
Compare(T1 a, T1 b);
T2max();
}
//调用
Compare <int,double> cmp(4, 7);
第4章 运算符重载
函数返回值类型 operator 运算符名称 (形参表)
{ 对运算符的重载处理}
例1:int operator+(int a, int b)
{return a + b; }
例2:class Complex
{
Complexoperator+ (Complex &c2);
}
ComplexComplex::operator+ (Complex &c2)
{ returnComplex(this->real + c2.real, this->imag + c2.imag) }
运算符重载函数在某个类中进行声明为成员函数,且判断运算符是否重载时,看重载运算符前的数值是否是运算符重载时需要的类型。
重载运算符规则:
(1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行加载;
(2)C++允许重载的运算符;
除了“.”、“*”、“::”、“sizeof”、“?:”这五个运算符。
(3)重载不能改变运算符运算对象(即操作数)的个数;
(4)重载不能改变运算符的优先级;
(5)重载不能改变运算符的结合律;
(6)重载运算符的函数不能有默认的参数;
(7)重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用);
(8)用于类对象的运算符一般必须重载,但运算符“=”和“&am