构造函数的作用是在创建对象时
第八章
一,构造函数的作用是在创建对象时,系统自动调用它来给所创建的对象初始化。 构造函数的特点:
● 构造函数是一种成员函数,他的说明在类体内,它的函数体可写在类体内,也可以
写在类体外。
● 构造函数是一种特殊的成员函数,该函数的名字与类名相同。定义和说明构造函数
时,不必指明函数的类型。
● 构造函数可以有一个参数或多个参数,也可以没有参数。
● 构造函数可以重载。
● 构造函数用于创建对象时的系统自动调用,也可以在程序中调用构造函数创建无名
对象。
构造函数的种类:
1. 默认构造函数。
2. 拷贝构造函数。
二, 析构函数的功能是用来释放一个对象的。当对象结束它的生存期时,系统将自动调用析构函数来释放该对象。析构函数与构造函数的作用正好相反。
析构函数的特点:
⏹ 析构函数也是一种成员函数,它的函数体可以写在类体外,也可以在类体内。 ⏹ 析构函数的名字同类名,与构造函数的区别是前面加~。
⏹ 析构函数没有参数,不能重载,也不必指明函数类型。
⏹ 析构函数通常是被系统自动调用的。
三, 成员函数的三个特征
◆ 内联和外联。
◆ 成员函数重载。
◆ 设置默认参数。
四, 静态成员
⏹ 特点: 属于类的,可以用类名加::引用。说明方法: static
⏹ 静态数据成员: 初始化方法,对象的特点。
⏹ 静态成员函数: 对数据成员的访问方式不同。
五, 友元函数
⏹ 说明方法: friend
⏹ 特点: 说明在类体内的外部数据成员,定义在类体外的非成员函数。
⏹ 作用: 访问类中的私有成员,提供程序运行效率。
⏹ 缺点: 破坏了类的封装性和隐蔽性。
第九章
一, 对象指针和对象引用
对象指针:指向对象的指针。
都可以用于函数参数和返回值。
二, 对象数组
1. 定义格式:
2. 对象数组元素:
3. 区别:指向对象数组的指针 和 对象指针数组。
三, 子对象和堆对象
子对象概念:一个对象作为另一个类的成员时,该对象称为类的子对象。子对象实际是某类的数据成员。
堆对象:在程序运行中,根据需要随时创建的对象称为堆对象。
C++中,内存被分为4种储存区域:
⏹ 代码区:用来存放程序代码的
⏹ 数据区:用来存放全局变量、静态类变量和常量等
⏹ 栈区: 用来存放局部变量、函数参数、返回值、返回地址和临时变量等
⏹ 堆区; 用来存放其余数据,包括对对象等
使用运算符new 创建堆对象。
使用运算符delete 释放对象。该运算符是专门用来释放由运算符new 所创建的变量或对象。 使用delete 的注意事项:
⏹ 该运算符必须用于由new 返回的指针。
⏹ 对于一个指针只能使用一次运算符delete 。
⏹ 指针名前只能使用一对方括号,而不管所释放数组的为数,并且方括号内不写任何
东西。
⏹ 该运算符也适应于空指针。
四, 类型转换和转换函数
● 类型转换包括隐含类型转换和强制类型转换。转换函数是一种强制类型转换。 ● 单参数的构造函数,提供了一种功能,可以将其他数据类型的数值或变量转换
为用户所定义的数据类型。这便是单参数构造函数所具有的类型转换功能。
转换函数的使用应该注意:
a) 转换函数是成员函数,但它必须是非静态的。
b) 在定义转换函数时不能带类型说明,因为该函数名字就是类型转换的目标类
型。
c) 转换函数是用来进行类型转换的,定义是不必带有任何参数。
d) 转换函数不能定义为友元函数。
第十章
一, 基类和派生类的概念 单继承和多继承 三中继承方式
派生类构造函数的调用顺序:
◆ 基类构造函数。
◆ 子对象构造函数。
◆ 派生类构造函数。
派生类析构函数的调用顺序:
◆ 先调用派生类的析构函数。
◆ 在调用派生类中子对象的析构函数。
◆ 最后调用基类的析构函数。
在基类中定义有默认构造函数或者没有定义任何构造函数时,派生类构造函数中省略对基类构造函数的调用。
二, 子类型
定义:
作用:子类型的重要作用就在于类型适应。
第十一章
一, 运算符重载的概念
声明:operator
大多少运算符都可以重载,只有4个不能: . .* :: ?:
运算符重载的四个不变原则:
● 优先性不变。
● 结合性不变。
● 操作个数不变。
● 语法结构不变。
运算符重载的两种形式:
● 成员函数形式
● 友元函数形式
二, 静态联编和动态联编的概念
静态联编:指在程序编译阶段进行联编的,这种联编又称为早期联编,这是因为这种联编工作是在程序运行之前完成的。
动态联编:指在程序运行时进行的联编,又称晚期联编。
继承是动态联编的基础,虚函数是动态联编的关键。
三, 动态联编的条件
● 公有继承
● 虚函数
引用虚函数的方法:对象引用和对象指针、成员函数。
虚函数的特性:
◆ 派生类中的虚函数与基类中的虚函数具有相同的参数个数、对应的参数
类型,相同的返回值类型。
◆ 基类中说明的虚函数具有自动向下传给他的派生类的性质。即派生类的
虚函数中的virtual 说明可以省略。
◆ 只有非静态数据成员函数才可以说明为虚函数。
◆ 构造函数不能说明为虚寒酸,因为对象在创建时它还没有确定的内存空
间,只有在构造后才是一个类的实例。析构函数可以是虚寒酸,并且最
好是在动态联编的时候说明成虚寒酸。
四, 抽象类
● 定义:抽象类是一种特殊的类,这种类不能定义对象。它的主要作用是用来组
织一个继承的层次结构,并由它提供一个公共的根,而相关的子类由它派生出
来。
● 特点:一个抽象类至少具有一个纯虚函数。
用途:抽象类用来描述一组子类的共同的操作接口,它只能用作基类,而完整
的实现由子类完成。
第十三章
格式化输出
设置对齐方式,设置数据宽度。
ios::left ios::right resetiosflags (long ), setiosflags(long) ,setfill(int), setw ()
Cout.width(int), cout.fill(int), cout.setf(), cout.precision(),
例子:
void main()
{
for(int i = 7; i>1;i--)
cout
for(int i = 1; i
cout
结果:
#
**#
****#
******#
********#
**********#
************#
**********#
********#
******#
****#
**#
#
#include
class B
public:
virtual void fn()
{
cout
}
};
class D:public B
{
public:
virtual void fn()
{
cout
}
};
void test(B &x)
{
x.fn();
}
void main()
{
B b;
test(b);
D d;
test(d);
}
结果:
In B.
In D.
#include
class A
public:
A()
{ a= 0;}
A(int i)
{ a = i;}
void print()
{ coutprivate:
int a;
};
class B:public A
{
public:
B()
{ b1=b2= 0;}
B(int i)
{ b1= 0; b2 = i;}
B(int i,int j, int k):A(i),b1(j),b2(k)
{ }
void print()
{ A::print();
cout
}
private:
int b1;
int b2;
};
void main()
{
B b1;
B b2(5);
B b3(1,2,3);
b1.print();
b2.print();
b3.print();
}
结果:
0,0,5
1,2,3
#include
#include
class Point
{
public:
Point(double i, duouble j)
{
x=i;
y=j;
}
void Getxy()
{
cout
friend double Distance(Point a,Point b); private:
double x,y;
}
double Distance(Point a,Point b)
{
double dx=a.x-b.x;
double dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
void main()
{
double d11=3.0,d12=4.0,d21=6.0,d22=8.0; Point p1(d11,d12), p2(d21,d22);
p1.Getxy();
p2.Getxy();
double d=Distance(p1,p2);
cout
结果:
(3,4)
(6,8)
Distance is 5
#include
class M
{
public:
M(int a)
{
A=a;
B+=a;
}
static void fun(M m); private:
int A;
static int B;
}
void M::fun(M m)
{
cout
int M::B=10;
void main()
{
M P(6),Q(8); M::fun(P); Q.fun(Q); }
结果: A=6
B=24
A=8
B=24