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