第十二章 构造函数

合集下载

构造函数的总结

构造函数的总结

概述:构造函数是在实例化对象时自动调用的函数。

它们必须与所属的类同名,且不能有返回值。

类或结构可能有多个接受不同参数的构造函数。

构造函数使得我们可设置默认值、限制实例化以及编写灵活且便于阅读的代码。

如果您没有为对象提供构造函数,则默认情况下 C# 将创建一个构造函数,该构造函数实例化对象,并将成员变量设置为 Default Values Table (C# Reference)中列出的默认值。

静态类和结构也可以有构造函数。

本文目的:介绍构造函数、静态构造函数、在构造函数中调用其他构造函数以及构造函数在派生类中的应用。

正文:1 单个类的构造函数1.1 无参构造函数public class UserAccessor{/// <summary>///无参构造函数/// </summary>public UserAccessor(){}}上面就是一个最简单的构造函数,可以看出该构造函数满足概述中所述的构造函数条件,在实例化UserAccessor类时,就执行UserAccessor()方法中的代码,在这里我们可以写下自定义的代码,如给字段赋值等。

1.2 有参构造函数public class UserModel{private string_userID;/// <summary>///有参构造函数/// </summary>/// <param name="userID"></param>public UserModel(string userID){_userID = userID;}}在实例化UserModel类时,我们就需要使用UserModel userModel = new UserModel("userIdDemo");实例化时必须传入制定的参数,这样就可以在实例化时存储于该实例相关的数据。

新标准C++程序设计教材答案 郭炜

新标准C++程序设计教材答案 郭炜

输出:Tom,18,7817,80
要求实现一个代表学生的类,并且所有成员变量都应该是私有的。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; class CStudent {
return _________________; } }; int main() { A a; cout <<a.val << endl; a.GetObj() = 5; cout << a.val << endl; return 0; } /* int n = 0 int & val 或: int n = 0 A& *this */ 10. 下面程序的输出是:
private: CHeadquarter * pHeadquarter; int nKindNo; //武士的种类编号 0 dragon 1 ninja 2 iceman 3 lion 4 wolf int nNo;
public: static char * Names[WARRIOR_NUM]; static int InitialLifeValue [WARRIOR_NUM]; CWarrior( CHeadquarter * p,int nNo_,int nKindNo_ ); void PrintResult(int nTime);
《新标准 C++程序设计》习题解答
第 11 章-第 20 章
郭炜
第十一章习题
1. 结构化程序设计有什么不足?面向对象的程序设计如何改进这些不足? 2. 以下说法正确的是: A) 每个对象内部都有成员函数的实现代码 B) 一个类的私有成员函数内部不能访问本类的私有成员变量 C) 类的成员函数之间可以互相调用 D) 编写一个类时,至少要写一个成员函数 #C 3. 以下对类 A 的定义,哪个是正确的? A) class A {

C++学习之类的构造函数、析构函数

C++学习之类的构造函数、析构函数

C++学习之类的构造函数、析构函数 在C++的类中,都会有⼀个或多个构造函数、⼀个析构函数、⼀个赋值运算操作符。

即使我们⾃⼰定义的类中,没有显⽰定义它们,编译器也会声明⼀个默认构造函数、⼀个析构函数和⼀个赋值运算操作符。

例如:1//声明⼀个空类2class Empty{};34//但是这个空类和下⾯这个类是等同的5class Empty6 {7 Empty(){.....}; //默认构造函数8 Empty( const Empty & rhs ){......} //复制构造函数9 ~Empty(){..........} //析构函数1011 Empty operator * (const Empty & rhs){.........}12 }; 值得注意的是,只有当这些函数被调⽤的时候,他们才会被编译器创建出来。

如果我们已经声明了⼀个构造函数,那么编译器将不会再创建⼀个默认构造函数。

下⾯来详细介绍⼀下构造函数和析构函数。

1.构造函数 构造函数(constructor)是与类同名的特殊成员函数,主要⽤于初始化对象的数据成员。

定义形式如下:1class X2 {3// .......4 X(); //⽆参构造函数5 X(......); //有参构造函数,构造函数⽀持重载67// .........8 }构造函数的声明和定义⽅法与类的其他成员函数相同,可以在类的内部定义构造函数,也可以先在类中声明构造函数,然后在类外进⾏定义。

在类外定义构造函数的形式如下:1 X :: X(.....)2 {3//...........4 } 构造函数具有以下⼏个特点: (1)构造函数与类同名 (2)构造函数没有返回类型,void也不⾏ (3)构造函数可以被重载 (4)构造函数由系统⾃动调⽤,不允许在程序中显⽰调⽤它 (5)构造函数的调⽤时机是定义对象之后的第⼀时间,即构造函数是对象的第⼀个被调⽤的函数 (6)定义对象数组或⽤new创建动态对象时,也要调⽤构造函数。

C#之构造函数

C#之构造函数

C#之构造函数构造函数分为:1.实例构造函数2.私有构造函数3.静态构造函数构造函数是⼀种特殊的⽅法,主要是为了给初始化对象赋初值。

1.实例构造函数使⽤new表达式创建某个类的对象时,会使⽤实例构造函数创建和初始化所有实例成员变量。

public class ProgramTest{int j;public ProgramTest(){j = 4;Console.WriteLine("I am ProgramTest,{0}", j);}static void Main(string[] args){ProgramTest pt = new ProgramTest();Console.Read();}结果为:I am ProgramTest,4在此次实验中,我们⾸先定义了⼀个私有成员j,经过初始化给他赋了⼀个初值4,当我实例化类ProgramTest时,就会执⾏实例构造函数。

诸如此类不带参数的构造函数叫“默认构造函数”,如果某个类没有构造函数,则会⾃动⽣成⼀个默认构造函数,并使⽤默认值来初始化对象字段。

public class ProgramTest{int j;public ProgramTest(){Console.WriteLine("I am ProgramTest,{0}", j);}static void Main(string[] args){ProgramTest pt = new ProgramTest();Console.Read();}}结果为:I am ProgramTest,0也可以创建带有参数的构造函数public class ProgramTest{int j;public ProgramTest(int i){j = 2;Console.WriteLine("I am ProgramTest,i={0},j={1}",i, j);}static void Main(string[] args){ProgramTest pt = new ProgramTest(1);Console.Read();}结果为:I am ProgramTest i=1,j=2那若是⼀个类中既有⽆参构造函数,⼜有有参构造函数那会怎么样呢?public class ProgramTest{int j;public ProgramTest(){j = 3;Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);}public ProgramTest(int i){j = 2;Console.WriteLine("I am ProgramTest 有参构造函数,i={0},j={1}",i, j);}static void Main(string[] args){ProgramTest pt1 = new ProgramTest();ProgramTest pt2 = new ProgramTest(1);Console.Read();}结果为:I am ProgramTest 默认构造函数 j=3I am ProgramTest 有参构造函数 i=1,j=2可见,若是两者同时存在,那么看类实例化时,是怎么实例的。

PJSUA2开发文档--第十二章PJSUA2API参考手册

PJSUA2开发文档--第十二章PJSUA2API参考手册

PJSUA2开发⽂档--第⼗⼆章PJSUA2API参考⼿册12.1 endpoint.hppPJSUA2基本代理操作。

namespace pjPJSUA2 API在pj命名空间内。

12.1.1 class Endpoint#include <endpoint.hpp>表⽰pjsua库的⼀个实例。

在应⽤程序中只能有⼀个pjsua库的实例,因此这个类是⼀个单例。

公有函数1)Endpoint()默认构造函数。

2)virtual ~Endpoint()virtual 析构函数3) libVersion() const获取lib版本。

4)void libCreate()实例化pjsua应⽤程序。

调⽤任何其他函数之前,应⽤程序必须调⽤此函数,以确保底层库被正确初始化。

⼀旦这个函数返回成功,应⽤程序必须在退出之前调⽤。

5)pjsua_state libGetState() const获取库状态。

返回lib状态。

6)void libInit(const &prmEpConfig )使⽤指定的设置初始化pjsua。

所有设置都是可选的,并且在未指定配置时将使⽤默认值。

请注意,在调⽤此函数之前必须调⽤create()。

参数prmEpConfig -配置7)void libStart()所有初始化完成后此功能,以便库可以进⾏其他检查设置。

应⽤程序可以在init()之后的任何时间调⽤此函数。

8)void libRegisterThread(const string&name )注册外部或本lib的API创建的线程请注意,每次调⽤此函数时,它将分配⼀些内存来存储线程描述,这只会在库被析构时被释放。

参数name -要分配给线程的可选名称。

9)bool libIsThreadRegistered()检查这个线程是否已经注册到库中。

注意,此函数仅适⽤于lib主⼯作线程和使⽤注册的外部/ lib的API创建的线程。

10)void libStopWorkerThreads()停⽌所有⼯作线程。

第2讲构造函数与析构函数

第2讲构造函数与析构函数

结果:
bookname is :Visual C++6.0 booknumber is:10020 bookname is : booknumber is:0 void Rec :: show ( ) //show的函数定义 { cout<<"bookname is :"<<bookname<<endl; cout<<"booknumber is:"<<number<<endl; } void main() //主程序 { Rec mybook(“Visual C++6.0”,10020); //自动调用构造函数Rec(char *a,int b) mybook.show(); Rec yourbook; //自动调用构造函数Rec() yourbook.show(); }
2.2.1 构造函数
构造函数(constructor)
–是与类名同名的特殊的成员函数
构造函数的定义格式为:
–类名(形参说明) –{ 函数体 }
构造函数调用时间:
–当定义该类的对象时,构造函数将被自动调用
构造函数的含义:
–实现对该对象的初始化 – 构造一个具有意义的正确对象
构造函数的特点
函数名和类名相同 无返回值 由系统自动调用,不允许直接调用 必须是公有(public)成员 可以重载 构造函数既可定义成有参函数,也可义成无参函 数,要根据问题的需要来定。 若没有定义构造函数,系统会定义一个默认的构造 函数: 类名(){} 但是若程序中提供了一个构造函数(不一定是无参 构造函数),则系统不再提供默认的构造函数
2.2.3 拷贝构造函数

第十二章 构造函数

第十二章 构造函数

12 章
构造函数
12.1 类与对象 12.2 构造函数的需要性 12.3 构造函数的使用 12.4 析构函数 12.5 带参数的构造函数 12.6 重载构造函数 12.7 默认构造函数 12.8 类成员初始化的困惑 12.9 构造类成员 12.10 构造对象的顺序
问题
• 类与对象的关系?能形象通过例子来说 明吗?
【 12.1 类与对象】
3、对象的初始化 根据变量定义,全局变量和静态变量在定义(分配空间)时,将位模式清0, 局部变量在定义时,为随机数。
对象是如何初始化?
• 对象表达了现实 对象是表达现实世界的实体,因此,一旦建立对象,
须有一个有意义的初始值。 C++建立和初始化对象的过程专门由该类的构造函数 来完成。 这个构造函数很特殊,只要对象建立,它马上被调用, 给对象分配空间和初始化。
构 造 函 数 可 以 在 类 内 定 义
class Desk { public: Desk(); //构造函数声明 protected: int weight; int height; int width; int length; }; Desk::Desk() //注意;不能有返回类型,哪怕是void { weight=10; height=5; width=5; length=5; }
【 12.1 类与对象】
1、类与对象的区别
类是描述事物所应具有的属性。一个对象是类的一个实例,它具有确定的属 性;对象可以被创建和销毁,但类是无所不在的。
class Desk //Desk类 { public: int weight; int height; int width; int length; }; class Stool //另一个类:Stool类 { public: int weight; int height; int width; int length; };

构造函数

构造函数

Box box2(15);
//只给定一个实参
cout<<″The volume of box2 is ″<<box2.volume( )<<endl;
Box box3(15,30);
//只给定2个实参
cout<<″The volume of box3 is ″<<box3.volume( )<<endl;
以前介绍过在函数中可以使用有默认值的参数。在 构造函数中也可以采用这样的方法来实现初始化。
上例的问题也可以使用包含默认参数的构造函数来 处理。 例 将上例程序中的构造函数改用含默认值的参数, 长、宽、高的默认值均为10。 在上例程序的基础上改写如下:
#include <iostream>
using namespace std;
例 在上例的基础上,定义两个构造函数,其中一
个无参数,一个有参数。
#include <iostream>
using namespace std;
class Box
{public:
Box( );
//声明一个无参的构造函数
Box(int h,int w,int len):height(h),width(w),length(len){ }
//建立对象t2,同时调用构造函数t2.Time( ) //显示t2的数据成员的值
return 0;
}
程序运行的情况为:
10 25 54↙ 10:25:54 0:0:0
(从键盘输入新值赋给t1的数据成员) (输出t1的时、分、秒值) (输出t2的时、分、秒值)
上面是在类内定义构造函数的,也可以只在类内对
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19
2、拷贝构造函数
结论:同一个类的两个对象拥有相同的成员 函数,但它们的成员数据可能不同,因此拷 贝构造函数只需拷贝成员数据。 例如: array a1(10); array a2(20); a1的数组a和a2的数组a内容不同,但a1和a2 的print()函数完全相同。
20
2、拷贝构造函数
2.5 拷贝构造函数中的&的作用 array::array(array const & src) { …… } 说明: & src表示参数src为引用类型
5
1、构造函数
1.3 构造函数的定义 class array { public: array(); //构造函数:函数名称和类名称相同 void input(); int getmax(); void print(); private: int a[3]; int max; };
6
1、构造函数
在类array外部定义构造函数 array::array() { cout << “in array::array"<<endl; for (int k = 0;k<3;k++) { a[k] = 0; } } 说明:构造函数没有返回值(也不需要void)
3
1、构造函数
void main() { array arr1;//创建对象; arr1.print();//打印内容是什么? arr1.print();// } 问题:能否在创建arr1时,将对象arr1的数 组a的元素都设置为0?
4
1、构造函数
1.2 什么是构造函数
作用 完成对象的初始化 语法 class_name (参数) { 语句; }
28
2、拷贝构造函数
2.5.4 拷贝构造函数为什么要使用引用传递方式 array::array (array const src) { …… } void main() { array a1; array a2(a1); } 说明:创建a2时调用拷贝构造函数,将a1拷贝给src,继续调用 拷贝构造函数,直到系统资源耗尽。
17
2、拷贝构造函数
2.3 拷贝构造函数的const作用 array::array(array const & src) { src.a[0] = 1;//编译错误:l-value specifies //const object } 作用: 通知编译器,src在该函数内不得被修改。
18
2、拷贝构造函数
23
2、拷贝构造函数
void main() { array arr1; array arr2(arr1);// arr2(arr1);//设置断点2: arr1 2: arr1的地址和 //内容是什么? }
24
2、拷贝构造函数
结论: 函数的参数为引用类型,则实参向形参的传 递为引用传递方式,实参和形参拥有相同的 地址。
47
5、练习
答案:x=1 提示:不带参数调用构造函数,则取默认参数
48
5、练习
练习3 以下程序的执行结果是什么 class s { public: s( ){ x = y = 0; } s(int a, int b ) { x = a; y = b; } void print() { cout << x << y; } private: int x,y; }; void main() { s s1(2,3); s1.print(); }
11
1、构造函数
void main() { array arr1; array arr2(99);//系统自动调用哪个构造函数? arr1.print(); arr2.print();//打印结果是什么? }
12
1、构造函数
思考题:有多个构造函数,系统如何确定应 该调用哪个构造函数? array(); array( int value); 提示:函数名称相同,参数不同。
函数的参数类型为类 void fun (array a) { a.print(); } void main() { array a1(10); fun(a1); //a1传递给a时调用拷贝构造函数 }
27
2、拷贝构造函数
2.5.3 系统何时调用拷贝构造函数
使用一个对象创建另外一个对象 void main() { array a1; array a2(a1);//创建a2是调用拷贝构造函数 }
42
5、练习
练习1 有以下类s的定义,s1的x值是多少? class s { int x; s(int a = 0) { x = ++a;} }; void main() { s s1 (10); } A. 0; B. 10; C. 11 D.语法错误
43
5、练习
答案: D.语法错误 提示:构造函数s::s是private
13
2、拷贝构造函数
2.1 什么是拷贝构造函数
作用 复制对象 语法 class_name (class_name const & source)
14
2、拷贝构造函数
2.2 拷贝构造函数的使用 class array { public: …. array(array const & src); private: int a[3]; int max; };
C++简明教程
2010-9-9
软件学院软件基础教研室
1
第十二章 构造函数
默认构造函数 拷贝构造函数 引用 析构函数
2
1、构造函数
1.1 问题的提出 class array { public: void input(); int getmax(); void print(); private: int a[3]; int max; };
练习2:函数fun的功能是交换a和b的值,并返 回交换结果,下列函数不能实现此功能的是: B. void fun (int &m,int &n) { int temp; temp = m; m = n; n = temp; }
33
3、引用的使用
练习2:函数fun的功能是交换a和b的值,并返 回交换结果,下列函数不能实现此功能的是: C. void fun (int m, int n) { int temp; temp = m; m = n; n = temp; }
7
1、构造函数
1.4 构造函数的使用 void main() { array arr1;// 创建对象时,系统自动调用构 // 造函数。 arr1.print();//打印内容是什么? }
8
1、构造函数
1.5 构造函数是必需的吗 如果类array没有提供构造函数,则系统自动 提供一个默认构造函数: array::array() { //没有任何语句 }
9
1、构造函数
1.6 构造函数可以有多个吗 class array { public: array(); array( int value); void input(); int getmax(); void print(); private: int a[3]; int max; };
10
1、构造函数
21
2、拷贝构造函数
2.5.1 如何区分&是引用还是取地址符 array::array(array const & src) &前有类型则为引用 array a; array * p; p = &a; //&前没有类型,则为取地址符
22
2、拷贝构造函数
2.5.2 参数为引用类型是值传递方式吗 array::array(array const & src) { cout << “拷贝构造 ”<< endl; for (int k = 0;k<3;k++)//设置断点1:src的地址和 //内容是什么? { a[k] = src.a[k]; } }
34
3、引用的使用
练习2:函数fun的功能是交换a和b的值,并返 回交换结果,下列函数不能实现此功能的是: D. void fun (int * k, int & m) { int temp; t = *k; *k = m; m = temp; }
35
3、引用的使用
答案:C
36
3、引用的使用
练习3: void sub (int x, int y, int & t) { t = x – y; } void main () { int a = 0; sub (10, 4, a); cout << a ; // a的值是多少? }
37
3、引用的使用
答案:a = 6
38
4、析构函数
4.1 什么是析构函数
作用 在对象销毁前执行用户希望执行的操作(如释放动 态申请的资源)。 语法 ~ class_name()
39
4、析构函数
4.2 析构函数的使用 class array { public: array(); array( int value); ~array(); //析构函数 void input(); …… private: …… };
25
2、拷贝构造函数
2.5.3 系统何时调用拷贝构造函数
函数的返回值类型为类 array fun() { array a1; return a1;//调用拷贝构造函数 } void main() { array a1; a1 = fun(); }
26
2、拷贝构造函数
2.5.3 系统何时调用拷贝构造函数
array::array()//将数组初始化为0 { for (int k = 0;k<3;k++) { a[k] = 0; } } array::array (int value) //将数组初始化为指定的值 { for (int k = 0;k<3;k++) { a[k] = value; } }
相关文档
最新文档