构造函数C++程序
C程序设计选择题汇总
C程序设计选择题汇总C程序设计选择题汇总⼀、单选题(每⼩题2分,共30分) 答案填⼊下表1.以下不合法的C语⾔标识符是( )。
A、_1B、IntC、a_bD、a--b2.设a和b均为float型变量,且a=5.5、b=2.5,则表达式(int)a+b/b的值是( )。
A、6.500000B、6C、5.500000D、6.0000003.以下叙述错误的是( )。
A、⼀个C程序可以包含多个不同名的函数B、⼀个C程序只能有⼀个主函数C、C程序在书写时,有严格的缩进要求,否则不能编译通过D、C程序的主函数必须⽤main作为函数名4.若a 是数值类型,则逻辑表达式(a==1)||(a!=1)的值是:( )。
A、1B、0C、2D、不知道a 的值,不能确定5.巳知字母A的ASCII码是65,以下程序的执⾏结果是 ( )#includemain(){ char c1='A',c2='Y';printf("%d,%d\n",c1,c2); }A、A,YB、65,89C、65,90D、65, 656.以下⼀维数组初始化语句中,正确的是( )。
A、int a[5]={1,2};C、int a[5]={5*2}D、int a[]=(1,2,0,0,0);7.若有char c[5]={'c','d','\0','e','\0'};则执⾏语句printf("%s",c);结果是( )。
A、cd\0eB、'c''d'C、cdD、cd e8.设变量均已正确定义并且赋值,以下与其他三组输出结构不同的⼀组语句是( )。
A、x++; printf(“%d\n”,x);B、n=++x; printf(“%d\n”,n);C、++x; printf(“%d\n”,x);D、n=x++; printf(“%d\n”,n);9.下⾯程序的输出结果是( )。
C语言里面构造函数和析构函数的运用办法
C语言里面构造函数和析构函数的运用办法C语言是一种面向过程的编程语言,没有类的概念,因此并不存在构造函数和析构函数的概念。
构造函数是在对象创建时被自动调用的特殊函数,用于初始化对象的成员变量。
析构函数是在对象销毁时自动调用的特殊函数,用于清理对象所占用的资源。
不过,虽然C语言本身没有构造函数和析构函数的语法支持,但可以通过编码技巧模拟实现一些类似的功能。
构造函数的作用是在创建对象时进行必要的初始化操作,一般包括为成员变量分配内存空间,初始化成员变量的值等。
在C语言中,可以通过在函数内定义一个结构体变量并将其指针返回,来实现类似构造函数的功能。
例如,以下代码演示了一个简单的"Person"结构体,包含姓名和年龄两个成员变量以及初始化和打印信息的函数。
```c#include <stdio.h>#include <stdlib.h>#include <string.h>typedef structchar name[20];int age;} Person;Person* createPerson(const char* name, int age)Person* p = (Person*) malloc(sizeof(Person));strcpy(p->name, name);p->age = age;return p;void printPerson(Person* p)printf("Name: %s, Age: %d\n", p->name, p->age);int maiPerson* p = createPerson("John", 25);printPerson(p);free(p); // 在不需要对象时,需要手动释放内存return 0;```上述代码中,createPerson函数实现了一个类似构造函数的功能,通过动态分配内存来创建一个结构体对象,并将参数拷贝到对应的成员变量中。
《c语言函数》PPT课件
精选课件ppt
4
2、使用参数 入口参数: 主调函数向被调函数传递的数据------实参、形参。
出口参数: 被调函数向主调函数传递的数据------返回值。
精选课件ppt
5
§7.2 函数的定义 问题: 1、被调函数如何使用主调函数中的数据。 2、假设被调函数有办法使用主调函数中的数据,如何保证 被调函数和主调函数中数据类型的一致。
在函数中允许有多个return语句,但每次调用只能有一个 return 语句被执行, 因此只能返回一个函数值。
精选课件ppt
15
2、函数值(回传值)的类型与被调用函数的类型说明
函数调用语句 被调函数类型 回传值类型
在定义函数时,需要指定函数的类型:
例如:
int max(x,y);
doubel a(c1,c2); 等等
1、被调函数为库函数 对库函数的调用不需要再作说明, 但必须把该函数的头
文件用include命令包含在源文件前部。
精选课件ppt
23
2、用户自定义的函数 一般应该在主调函数中对被调函数的返回值的类型做说明。 对被调函数的说明也有两种格式,
一种为传统格式,其一般格式为: 类型说明符 被调函数名();
9
调用结束:形参临时单元被释放,形参数据失效,实参数 据不变。这就是所谓的单值传递。
函数的形参和实参具有以下特点:
(1)、形参变量只有在被调用时才分配内存单元,在调用 结束时, 即刻释放所分配的内存单元。因此,形参只有在 函数内部有效。 函数调用结束返回主调函数后则不能再使 用该形参变量。
精选课件ppt
}
精选课件ppt
c语言 结构体构造函数
C语言结构体如何实现构造函数C语言是一门面向过程编程语言,因此在C语言中并没有像其他面向对象语言一样的构造函数。
但是,我们可以使用结构体的一些特性来实现类似构造函数的功能。
一般来说,结构体的定义如下:struct person{char name[20];int age;};然后我们可以用以下方式为结构体创建一个变量并初始化:struct person tom={"Tom",18};但是,当结构体中的字段比较多时,手动初始化一个结构体变量会变得比较麻烦。
此时,我们可以自定义一个结构体的构造函数来方便地初始化结构体变量。
一个简单的结构体构造函数示例如下:struct person create_person(char*name,int age){struct person new_person;strcpy(new_,name);new_person.age=age;return new_person;}这个例子中,create_person函数接收两个参数,分别为姓名和年龄。
它首先创建一个新的结构体变量new_person,然后使用strcpy函数将name复制到new_中,最后将年龄赋值给new_person.age。
最后,函数返回new_person结构体变量。
当我们需要创建一个person结构体变量时,可以使用create_person函数,如下示例:struct person tom=create_person("Tom",18);这样就能方便地创建一个新的person结构体变量并赋值给变量tom。
总之,尽管C语言中没有原生的构造函数,但我们可以使用结构体的特性来实现类似构造函数的功能,从而方便地初始化结构体变量。
北师大网网络教育 C 程序设计一(答案)
《C++程序设计》第一套作业及其答案说明:本套作业涵盖第1章——第4章所学的内容。
本套作业共有38道单选题,1道多选题,共41个答案,满分为100分,错一个答案扣除2.5分。
1、在一个C++程序中,main函数的位置(C)。
(A)必须在程序的开头(B)必须在程序的后面(C)可以在程序的任何地方(D)必须在其它函数中间2、C++程序中的语句必须以(B)结束。
(A)冒号(B)分号(C)空格(D)花括号3、在下列八进制整型常量的表示中,(B)是正确的。
(A)0a0 (B)015 (C)080 (D)0x104、在下列十六进制整型常量的表示中,(C)是错误的。
(A)0x11 (B)0xaf (C)0xg (D)0x1f5、下列正确的字符常量为(D)。
(A)“a”(B)“\0”(C)a (D)‘\101’6、在下列运算符中,(D)优先级最低。
(A)!(B)&& (C)!= (D)?:7、设i=1, j=2,则表达式i+++j的值为(C)。
(A)1 (B)2 (C)3 (D)48、已知i=0, j=1, k=2,则逻辑表达式++i || --j && ++k的值为(B)。
(A)0 (B)1 (C)2 (D)39、设a=1, b=2, c=3, d=4,则条件表达式a<b ? a : c<d ? c : d的值为(A)。
(A)1 (B)2 (C)3 (D)410、逗号表达式(x = 4 * 5, x * 5), x + 25的值为(D)。
(A)25 (B)20 (C)100 (D)4511、已知int i, x, y; 在下列选项中错误的是(C)。
(A)if(x && y) i++; (B)if(x = y) i--;(C)if(xy) i--; (D)if(x + y) i++;-1 x<012、设有函数关系为 y = 0 x=0 ,下面选项中能正确表示上述关系为(C)。
c语言 构造函数
C语言中的构造函数:让你的代码更生动有力对于C语言中的构造函数,很多初学者可能会感到比较陌生。
所以,本文将从基础开始,逐步介绍C语言中的构造函数,让大家更好地理解它的作用。
首先,我们需要知道,C语言并没有像其他面向对象语言那样有构造函数这个概念。
但是,在C语言中,我们可以通过一些技巧来实现构造函数的功能。
具体来说,我们可以在定义结构体时,为其添加一个初始化函数。
这个函数可以用来初始化结构体中的各个成员变量,从而达到构造函数的效果。
例如:struct a{int x;int y;void (*init)(struct a*);};void init_a(struct a* self){self->x = 0;self->y = 0;}在上面的代码中,我们定义了一个结构体a,其中包含了两个成员变量x和y,以及一个指针类型的函数init。
同时,我们还定义了一个名为init_a的函数,它的作用是初始化结构体a中的成员变量x和y。
在定义init_a函数时,我们将self指针作为参数,这个指针指向了要被初始化的结构体实例。
在init_a函数中,我们就可以通过self 指针来访问结构体实例中的成员变量,从而完成初始化的任务。
通过这种方式定义的初始化函数,我们就可以在创建结构体实例时,自动调用这个函数,实现构造函数的效果。
例如:struct a obj;obj.init = init_a;obj.init(&obj);在上面的代码中,我们创建了一个名为obj的结构体实例,并将init_a函数注册到了obj.init指针中,这样在调用obj.init(&obj)时,就会执行init_a函数,从而完成obj结构体实例的初始化。
通过上面的示例代码,我们可以看出,C语言中的构造函数虽然需要手动实现,但是通过一些技巧的组合,我们同样可以让我们的代码更加生动有力。
聊城大学计算机学院面向对象的程序设计(c++)练习题(第三周)(构造函数和析构函数)
聊城大学计算机学院面向对象的程序设计第三次作业一、单选题(本大题共17小题,每题3分,共51分):1、在下列函数原型中,可以作为类AA构造函数的是()。
A void AA(int);B int AA( );C AA(int) const;D AA(int);2、下列选项中,哪一项功能是对对象进行初始化()。
A 析构函数B 数据成员C 构造函数D 静态成员函数3、假定A为类名,执行A x;语句时将自动调用该类的()。
A 有参构造函数B 无参构造函数C 拷贝构造函数D 赋值构造函数4、下列关于构造函数的说法,错误的是()。
A 系统可以提供默认的构造函数B 构造函数可以有参数,所以可以有返回值C 构造函数可以重载D 构造函数可以设置默认参数5、有如下类定义:class Point{int x, y;public:Point__________:x_(0), y_(0){}Point(int x, int y = 0):x_(x), y_(y){}};若执行语句:Point a(2), b[3], *c[4];则Point类的构造函数被调用的次数是()。
A 2次B 3次C 4次D 5次6、在下面的类定义中class sample{public:sample(int val); //①~sample( ); //②private:int a=2.5; //③public:sample( ); //④};其中错误的语句是()。
A ①B ②C ③D ④7、假定一个类的构造函数为A(int i = 4, int j = 0) { a = i; b = j;}则执行A x(1)语句后,x.a和x.b的值分别为()。
A 1和0B 1和4C 4和0D 4和18、下列关于构造函数的描述中,错误的是()。
A 构造函数可以设置默认参数B 构造函数在定义类对象时自动执行C 构造函数可以是内联函数D 构造函数不可重载9、下列选项中,哪一项不是构造函数的特征()。
c语言 construct函数
C语言中的construct函数在C语言中,construct函数是一个非常重要的概念。
它主要用于在定义结构体的同时初始化结构体的成员,以便在程序运行时快速地对结构体进行初始化操作。
1. construct函数的基本概念在C语言中,结构体是一种用户自定义的数据类型,它可以包含多个不同类型的数据成员。
当我们定义一个结构体的可以通过construct 函数来对结构体的成员进行初始化。
这样,我们就可以在创建结构体变量的给结构体的成员赋予初始值,以便在后续的程序运行中能够快速地使用这些数据成员。
2. construct函数的使用方法在C语言中,我们可以通过在定义结构体时使用construct函数来对结构体的成员进行初始化。
例如:```ctypedef struct {int id;char name[20];} Student;Student s = {10, "Jack"};```在上面的例子中,我们定义了一个名为Student的结构体,并在定义结构体变量s的通过construct函数对id和name成员进行了初始化。
3. construct函数的作用construct函数的作用在于简化程序中对结构体成员的初始化操作。
通过使用construct函数,我们可以在定义结构体变量的直接给结构体的成员赋予初始值,以便在后续程序运行中能够快速地使用这些数据成员。
4. construct函数的个人理解在我看来,construct函数是C语言中非常实用的一个特性。
它可以帮助我们在定义结构体的同时对结构体的成员进行初始化,从而简化程序的编写过程。
它也可以使程序更加清晰易懂,从而提高代码的可读性和可维护性。
总结:construct函数在C语言中扮演着非常重要的角色。
通过使用construct函数,我们可以在定义结构体的同时对结构体的成员进行初始化,以便在后续程序运行中能够快速地使用这些数据成员。
这一特性大大简化了程序的编写过程,提高了代码的可读性和可维护性。
c语言 结构体构造函数
C语言结构体构造函数简介在C语言中,结构体(struct)是一种自定义的数据类型,用于将不同类型的变量组合在一起形成一个新的复合数据类型。
结构体构造函数是一种用于创建并初始化结构体变量的方法,类似于其他面向对象编程语言中的构造函数,用于为结构体变量分配内存空间并初始化其成员变量。
本文将详细介绍C语言中结构体构造函数的概念、使用方法以及注意事项。
结构体构造函数的定义和作用结构体构造函数是一种特殊的函数,用于创建并初始化结构体变量。
它的作用是方便地为结构体变量分配内存空间并初始化其成员变量,避免手动分配内存和逐个初始化成员变量的繁琐过程。
结构体构造函数的定义与普通函数类似,但其函数名与结构体类型相同,没有返回类型,并在函数体内部完成了分配内存和初始化成员变量的过程。
例如:typedef struct {int age;char name[20];} Person;Person createPerson(int age, const char* name) {Person p;p.age = age;strcpy(, name);return p;}在上述代码中,createPerson函数是一个结构体构造函数,用于创建并初始化Person类型的结构体变量。
它接受两个参数,分别是年龄和姓名,将这些值分别赋给p的成员变量age和name,最后返回创建好的结构体变量p。
使用结构体构造函数创建结构体变量使用结构体构造函数创建结构体变量非常简单,只需要调用结构体构造函数并传入相应参数即可。
以下是使用上述createPerson函数创建Person类型结构体变量的示例:Person person1 = createPerson(25, "Tom");在上述示例中,createPerson函数被调用并传入了25和”Tom”作为参数,返回的结构体变量被赋给了person1。
结构体构造函数的优点结构体构造函数的引入使得创建和初始化结构体变量变得更加便捷和可读,具有以下几个优点:1.简化代码:使用结构体构造函数可以避免手动分配内存和逐个初始化成员变量的繁琐过程,减少了代码的冗余,提高了代码的可读性和可维护性。
c++ new 数组 构造函数
一、介绍C++中new数组的用法C++中new操作符用于动态分配内存,可以用来创建单个对象的内存空间,也可以用来创建数组的内存空间。
在使用new创建数组时,需要使用构造函数来初始化数组中的元素,这样可以确保数组中的每个元素都具有合适的初值。
在本文中,我们将重点介绍C++中如何使用new操作符来创建数组,并使用构造函数进行初始化。
二、使用new创建数组在C++中,可以使用new操作符来创建数组,并使用构造函数进行初始化。
具体的语法格式如下:```Type *arrayName = new Type[size];```其中,Type表示数组中元素的数据类型,arrayName表示数组的名称,size表示数组的大小。
使用new操作符创建数组时,会动态分配指定大小的内存空间,并返回该内存空间的首位置区域,存储在指针arrayName中。
三、构造函数的作用构造函数是一种特殊的成员函数,它的作用是在创建对象时进行初始化。
在C++中,可以使用构造函数来初始化数组中的元素,确保数组中的每个元素都具有合适的初值。
四、使用构造函数初始化数组在使用new创建数组时,可以利用构造函数来初始化数组中的元素。
具体的方法是通过循环遍历数组,对每个元素调用相应的构造函数进行初始化。
对于包含int类型元素的数组,可以使用如下代码进行初始化:```for (int i = 0; i < size; i++) {arrayName[i] = Type(args);}```其中,Type表示数组中元素的数据类型,args表示传递给构造函数的参数。
通过循环遍历数组的方式,可以确保数组中的每个元素都被正确初始化。
五、析构函数的作用与构造函数相对应的是析构函数,它的作用是在对象被销毁时进行清理工作。
在使用new创建数组时,如果数组中的元素是动态分配的对象,则需要在数组销毁时手动调用每个元素的析构函数进行清理工作,以避免内存泄漏。
六、使用析构函数进行清理工作在使用new创建数组时,如果数组中的元素是动态分配的对象,则需要在数组销毁时手动调用每个元素的析构函数进行清理工作。
c语言 结构体构造函数
c语言结构体构造函数结构体构造函数是C语言中一种用于创建结构体对象的方法。
通过构造函数,可以为结构体对象的成员变量赋初值,从而方便后续使用。
本文将从以下几个方面介绍C语言中的结构体构造函数。
一、什么是结构体?在C语言中,结构体是一种自定义数据类型。
它可以由多个不同的数据类型组成,称为结构体成员。
结构体成员可以是基本数据类型、指针、数组等其他结构体类型。
结构体定义的一般形式如下:struct 结构体名称{数据类型成员1名称;数据类型成员2名称;…};二、结构体初始化方法在使用结构体时,需要先定义结构体变量,然后再对其成员变量进行赋值。
如果结构体成员变量较多,这种方式会比较麻烦。
因此,我们可以使用结构体初始化方法进行赋值。
结构体初始化的一般形式如下:struct 结构体名称结构体变量名称= {成员1初始值, 成员2初始三、结构体构造函数的作用结构体构造函数是一种用于创建结构体对象的方法。
通过构造函数,可以为结构体对象的成员变量赋初值,从而方便后续使用。
在C语言中,结构体构造函数可以通过函数的形式来实现。
四、结构体构造函数的实现在C语言中,结构体构造函数的实现非常简单。
我们只需要定义一个函数,函数返回值为结构体类型,函数名为结构体名称,函数参数为结构体成员变量的初值。
例如:struct 结构体名称结构体名称(数据类型成员1名称, 数据类型成员2名称, …){struct 结构体名称结构体变量名称;结构体变量名称.成员1名称 = 成员1名称;结构体变量名称.成员2名称 = 成员2名称;…return 结构体变量名称;}通过上述代码,我们可以实现一个简单的结构体构造函数。
在调用该函数时,只需要传入结构体成员变量的初值即可创建一个结构体五、结构体构造函数的应用结构体构造函数的应用非常广泛。
例如,在编写网络编程时,经常需要使用结构体来表示网络数据包。
通过结构体构造函数,可以方便地创建一个网络数据包对象,并设置其各个成员变量的初值。
C++中构造函数作用
C++中构造函数作⽤⼀、 构造函数是⼲什么的该类对象被创建时,编译系统对象分配内存空间,并⾃动调⽤该构造函数->由构造函数完成成员的初始化⼯作eg: Counter c1;编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调⽤构造函数Counter( )⾃动地初始化对象c1的m_value值设置为0故:构造函数的作⽤:初始化对象的数据成员。
⼆、 构造函数的种类class Complex{private :double m_real;double m_imag;public:// ⽆参数构造函数// 如果创建⼀个类你没有写任何构造函数,则系统会⾃动⽣成默认的⽆参构造函数,函数为空,什么都不做// 只要你写了⼀个下⾯的某⼀种构造函数,系统就不会再⾃动⽣成这样⼀个默认的构造函数,如果希望有⼀个这样的⽆参构造函数,则需要⾃⼰显⽰地写出来Complex(void){m_real = 0.0;m_imag = 0.0;}// ⼀般构造函数(也称重载构造函数)// ⼀般构造函数可以有各种参数形式,⼀个类可以有多个⼀般构造函数,前提是参数的个数或者类型不同(基于c++的重载函数原理)// 例如:你还可以写⼀个 Complex( int num)的构造函数出来// 创建对象时根据传⼊的参数不同调⽤不同的构造函数Complex(double real, double imag){m_real = real;m_imag = imag;}// 复制构造函数(也称为拷贝构造函数)// 复制构造函数参数为类对象本⾝的引⽤,⽤于根据⼀个已存在的对象复制出⼀个新的该类的对象,⼀般在函数中会将已存在对象的数据成员的值复制⼀份到新创建的对象中 // 若没有显⽰的写复制构造函数,则系统会默认创建⼀个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,具体原因请查询 有关 “浅拷贝” 、“深拷贝”的⽂章论述Complex(const Complex & c){// 将对象c中的数据成员值复制过来m_real = c.m_real;m_imag = c.m_imag;}// 类型转换构造函数,根据⼀个指定的类型的对象创建⼀个本类的对象,//需要注意的⼀点是,这个其实就是⼀般的构造函数,但是对于出现这种单参数的构造函数,C++会默认将参数对应的类型转换为该类类型,有时候这种隐私的转换是我们所不想要的,所以需要使⽤explicit来限制这种转换。
c语言构造函数
c语言构造函数一、概述C语言是一种高级编程语言,它支持面向对象编程。
在C++中,我们可以使用构造函数来初始化对象的数据成员。
但是,在C语言中并没有直接支持构造函数的语法,因此我们需要自己实现构造函数。
二、什么是构造函数?在C++中,构造函数是一种特殊的成员函数,它用于初始化类的对象。
当创建一个类的对象时,构造函数会被调用来初始化这个对象的数据成员。
在C语言中,我们可以使用结构体来模拟类,并且可以使用指向结构体的指针来模拟对象。
因此,在C语言中实现构造函数就变得十分重要。
三、如何实现构造函数?在C语言中,我们可以通过以下两种方式来实现构造函数:1. 使用工厂方法工厂方法是一种创建对象的设计模式。
它将对象的创建过程封装在一个工厂类中,并通过调用工厂方法来创建对象。
在C语言中,我们可以定义一个结构体作为类,并定义一个工厂方法来创建这个结构体的实例。
例如:```typedef struct {int x;int y;} Point;Point* create_point(int x, int y) {Point* p = (Point*)malloc(sizeof(Point));p->x = x;p->y = y;return p;}```2. 在结构体中定义初始化函数在C语言中,我们也可以在结构体中定义一个初始化函数来实现构造函数的功能。
例如:```typedef struct {int x;int y;void (*init)(Point*, int, int);} Point;void init_point(Point* p, int x, int y) {p->x = x;p->y = y;}Point p1 = {0, 0, init_point};p1.init(&p1, 1, 2);```四、结论通过以上两种方式,我们可以在C语言中实现类似于C++中的构造函数的功能。
c语言结构体的构造函数
c语言结构体的构造函数C语言结构体的构造函数1. 引言C语言是一种通用的高级编程语言,广泛应用于嵌入式系统开发、操作系统以及各种应用程序的开发中。
其中,结构体是C语言中一种非常重要的数据类型,用于组织和管理不同类型的数据。
结构体的构造函数是一种用来初始化结构体对象的特殊函数,它能够为结构体成员赋予初始值,提高代码的可读性和可维护性。
2. 结构体及其定义结构体是一种用户自定义的数据类型,它可以由不同类型的数据组成,这些数据称为结构体的成员。
在C语言中,结构体的定义通常包含在函数外部,以便在整个程序中都能访问到该结构体。
下面是一个简单的结构体定义的示例:```cstruct Student {char name[20];int age;float score;};```上述代码定义了一个名为`Student`的结构体,它包含了三个成员变量,分别是名字、年龄和分数。
3. 构造函数的定义结构体的构造函数是一种特殊的函数,它会在创建结构体对象时被调用,用来为结构体成员赋予初始值。
构造函数的命名通常与结构体的名称相同,并在名称前加上一个下划线。
下面是一个构造函数的定义示例:```cvoid Student_init(struct Student* stu, char* name, int age, float score) {strcpy(stu->name, name);stu->age = age;stu->score = score;}```上述代码定义了一个名为`Student_init`的构造函数,它接受一个指向结构体对象的指针`stu`,以及三个用于初始化结构体成员的参数。
在构造函数内部,通过使用`strcpy`函数来复制字符串,将传入的`name`参数赋值给结构体的`name`成员变量;然后直接将`age`和`score`参数赋值给结构体的相应成员变量。
4. 构造函数的使用使用结构体的构造函数可以方便地创建并初始化结构体对象。
《C语言程序》测试题及答案
c++程序设计本科一、判断题错误的在后面写“F”,正确的写“T”,每题1分1. 程序是描述算法的编程工具;T2. 将函数模板与某个具体数据类型连用,就产生了模板函数,称这个过程为函数模板实例化 ; T3. C++语言中,用来为对象初始化的特殊成员函数称为构造函数;用于在对象撤销时执行一些清理任务的特殊成员函数称为析构函数; T4. 逐条翻译并执行的翻译程序称为编译程序; F5. 把所有类组织在一个树形结构中,这时所有类,不管它们之间的差别有多大,都有一个共同的相关类,这种结构被称为类树;类群是由一些彼此密切相关的类和类族组成的;F6. 如果在定义一个类时,该类继承了多个基类的特征,那么这个继承关系称为多重继承;T7. 不同对象可以调用相同名称的函数,并可导致完全相同的行为的现象称为多态性;F8.形式参数表是用括号分隔的变量说明列表,变量称为函数的形式参数,有时也简称为形参; F9..在C++语言中,只要在声明函数原型时形式参数的个数或者对应的类型不同,两个或更多的函数就可以共用同一个名字;这种在同一作用域中允许多个函数使用同一函数名的措施被称为重载; T8.C++的作用域分辨:可以迫使编译器“看到”当前作用域的外层部分,存取那些被隐藏的名字;这是由作用域分辨操作符实现的,这一过程叫做作用域分辨;T11.说明函数原型时不需要指明每个函数参数的名字,只需要说明每个参数的类型和返回值类型就可以了;T12.所有的表达式都有值;F13.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量;T14.类的静态数据成员需要在定义每个类的对象时进行初始化;F15.基类中被说明为protected和private的成员只能被其派生类的成员函数访问,不能被其它的函数访问;F16.当将一个类S定义为另一个类A的友元类时,类S的所有成员函数都可以直接访问类A的所有成员;T17.当函数的返回值是数组类型的,传递的是数组第一个元素的地址;F18.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性;T19.字符串’hello,world”在内存中存放时,占用11个字节的空间;F20. 用new动态申请的内存空间,必须用delete来释放 ;T21、变量必须先定义或说明,后使用;T23、常量不能作为左值使用;T23、头文件中一般存放着变量和常量的定义、函数的原型以及类的定义;F24、类的友元函数可以直接访问该类的所有成员;T25、派生类的成员函数可以直接访问基类的所有成员;F26、一个类可以作为另一个类的友元类;T27、函数的参数和返回值类型可以是简单数据类型,也可以是指什、引用、数组和类;F28、在基类中被说明为虚函数的类的成员函数必须在每个派生类中说明为虚函数,才能具有多态的特征;F29、下面两个语句是等价的: Fchar str ="hello,world";char str11="hello,world";30、用new动态申请的内存是在堆中分配的,而不是在栈中分配的; T31.静态联编所支持的多态性称为编译时的多态性; T32.如果一个类中至少有一个实函数,则称这个类为抽象类 ; F33.用于在对象消失时执行一些清理任务的函数叫虚函数; F34. C++源程序文件的缺省扩展名为cpp T35. 由C++源程序文件编译而成的目标文件的缺省扩展名为lik F36. 由C++目标文件连接而成的可执行文件的缺省扩展名为obj F37. 编写C++程序一般需经过的几个步骤依次是编辑、编译、连接、调试 T38. 标识符default then while全是保留字 F39. 能作为C++程序的基本单位是语句 T40. 程序中主函数的名字为任意标识符 F二、填空题每题3分1. 假定x=5,y=6,则执行表达式y+=x--计算后,x和y的值分别为_____4_____和___11_______;2. C++常数0x145对应的十进制值为____325______;3. C++常数0345对应的十进制值为____229______;4. 十进制常数245对应的十六进制的C++表示为____0xF5 F大小写均可_____5. 十进制常数245对应的八进制的C++表示为___0365 F大小写均可_______;6. signed char类型的值域范围是_-128_______至_____+127_____之间的整数;7. int和float类型的数据分别占用___4______和______4____个字节;8. float和double类型的数据分别占用_____4____和__ 8______个字节;9. bool和char类型的数据分别占用____1_____和_____1___个字节;10. unsigned short int和int类型的长度分别为___2______和____4____;11. 字符串“This\’s a book.\n”的长度为___15_______;12. 字符串“\nThis\’s a pen\n\n”的长度为_____15_____;13. 在C++中存储字符串“abcdef”至少需要___7_____个字节;14. 在C++中存储字符串“a+b=c”至少需要__6______个字节;14.假定x和y为整型,其值分别为16和5,则x%y和x/y的值分别为_____1_____和______3____;15.若while循环的“头”为”whilei++<=10”,并且i的初值为0,同时在循环体中不会修改i的值,则循环体将被重复执行__11____次后正常结束;17. 若do循环的“尾”为”while++i<10”,并且i的初值为0,同时在循环体中不会修改i 的值,则循环体将被重复执行____10__次后正常结束;18. 当在程序中执行到__break______语句时,将结束本层循环类语句或switch语句的执行;19. 当在程序中执行到____continue____语句时,将结束所在循环语句中循环体的一次执行;20. 在程序中执行到____ return ____语句时,将结束所在函数的执行过程,返回到调用该函数的位置;21.在程序执行完__ 主或main_____函数调用后,将结束整个程序的执行过程,返回到C++集成开发窗口;22. 元素类型为int的数组a10共占用___40_____字节的存储空间;23. 元素类型为double的二维数组a46共占用___192_____字节的存储空间;24. 元素类型为char的二维数组a1030共占用___300_____字节的存储空间;25. 存储字符’a’和字符串”a”分别需要占用____1____和_____2___个字节;26. 空串的长度为___0_____,存储它需要占用___1_____个字节;27. 字符串”\’a\’xy=4\n”的长度为__7______;28. 字符串”a:\\xxk\\数据”的长度为__11__;29. 用于存储一个长度为n的字符串的字符数组的长度至少为___ n+1_____;30. 若a是一个字符数组,则从键盘上向该数组输入一个字符串的表达式为_ cin>>a___;31. C++是将源程序_一次翻译成目标程序_____,然后再执行,这种翻译程序称为编译程序;32. 联合的若干数据成员使用地址___同一___,占据的内存是联合中占内存最大的数据成员所占用的内存;33. 作用域分辨操作符的一般形式为类名::类标识符 ,作用域分辨不仅可用于类中,而且可以用在____函数调用__ 时;34. 将关键词const写在 ___函数头___ 之后, __函数体____, 之前,说明该函数是一个const成员函数;35. C++是在 ___标准C语言___ 的基础上,引入面向对象概念而扩充形成的混合型面向对象语言;36. 在动态联编中,直到 _程序运行_____ 时才能确定调用哪个函数;静态联编是在程序编译时进行的;37. 类型转换函数 ___不能___ 带有参数,当被派生类继承并被说明为 ___虚函数___ 时,可以定义多个转换函数;38. 继承是 ___对象___ 的一个特点,继承支持 ___层次___ 类概念39. C++的 __作用域____ 规则能保证编译器调用正确的成员函数;40. 在C++中,声明构造函数和析构函数时, _不能_____使用const或volatile关键词;41. 只能用类运算符来重载的运算符是:_=_____,______,______,___->___;42. 应该养成将所有extern说明放到__头文件____ 中去的习惯,对于自己编写的函数,必须自己给出 __函数类型____ 说明;43. 结构是 ___类___, 的一种特例,其中成员在缺省情况下是_公有的_____ ;44. 当使用delete删除一个对象时,delete隐含着对 __析构函数____ 函数的一次调用,如果这个函数为虚函数,则这个调用采用___动态___联编;45. const放在函数前面使常量成员返回 __常量对象____ ;如果定义一个const对象,则只能访问该对象的const 成员函数;46.在面向对象的程序设计中,一切都是围绕着___类___ 展开的;47.析构造函数是和___类___同名的函数;48.指向基类的对象的指针变量也可以指向___派生类______的对象;49.若多继承时,多个基类中拥有一个同名的成员,则__不能_______用调整访问权限确定对该成员的访问50.多继承情况下,派生类的构造函数的执行顺序取决于__继承_______派生类时所指定的各基类的顺序;51.构造函数___不能__被继承,析构函数______不能______被继承;52.___多___继承情况下,派生类中对基类成员的访问会出现二义性;解决二义性的方法是______成员名限定法______、___支配规则__和__虚基类___53.垂直访问时,保护成员的访问控制权限与______公有___成员相同;54.派生类可以调用其____基类_____中不具备的数据和操作;55.利用继承能够实现___软件复用______;这种实现缩短了程序的开发时间,促使开发人员复用已经测试和调试好的高质量软件;56.当撤消一个含有基类和子对象成员的派生类对象时,将首先完成___派生类___的析构函数定义体的执行,接着完成______子对象成员______的析构函数定义体的执行,最后完成___基类___的析构函数定义体的执行;57.如果类Alpha继承了类Beta,则类Alpha称为___派生___类,类Beta称为__基___类58.对基类数据成员的初始化必须在派生类构造函数中的____成员初始化列表_____处执行;59.在派生类中使用基类的成员,可以显示地使用__成员名限定符_______来使用基类成员60.当将基类指针转换为派生类指针时,由于编译器认为这种操作是危险的,所以必须要使用____强制类型转换_____;61.多继承可以视为是___单继承___的扩展,派生类及其基类可用一个___有向无环图DAG___表示;62. 继承是___对象___的一个特点,继承支持___层次___类概念;63.若需要定义一个标识符常量,并且使C++能够进行类型检查,则应在定义语句的开始使用保留字const .64.逻辑表达式x>3&&x<10 的相反表达式为x<=3||x>=10 .65.逻辑表达式a>b ||b = =5的相反表达式为a<=b&&b=5 .66.假定一个二维数组的定义为”char a56;”,则该数组所含元素的个数为30 ,所占存储空间的字节数为30 .67.变量分为全局和局部两种, 全局变量没有赋初值时,将由系统自动置为0.68.假定a是一个一维数组,则ai对应的存储地址以字节为单位为a+isizeof ai69.假定一个结构类型的定义为”struct A{int a,b;Ac;};”, 则该类型的大小为12字节.70.假定要访问一个结构指针p所指对象中的b指针成员所指的对象,则表示方法为p->b .三、单选题每题2分,在下列各题的备选答案中,选出一个正确答案,并将其号码填写在题目后面的括号内;A 1. C++源程序文件的缺省扩展名为 ;A. cppB. exeC. objD. likC 2. 由C++源程序文件编译而成的目标文件的缺省扩展名为 ;A. cppB. exeC. objD. likB 3. 由C++目标文件连接而成的可执行文件的缺省扩展名为 ;A. cppB. exeC. objD. likB 4. 编写C++程序一般需经过的几个步骤依次是 ;A. 编译、编辑、连接、调试B. 编辑、编译、连接、调试C. 编译、调试、编辑、连接D. 编辑、调试、编辑、连接B 5. 以下标识符中不全是保留字的是 ;A. case for intB. default then whileC. bool class longD. goto return charC 6. 能作为C++程序的基本单位是 ;A. 字符B. 语句C. 函数D. 源程序文件A 7. 程序中主函数的名字为 ;A. mainB. MAINC. MainD. 任意标识符D 8. C++程序的基本模块为 ;A. 表达式B. 标识符C. 语句D. 函数B 9. 可用作C++语言用户标识符的一组标识符是 ;A. void define +WORDB. a3_b3 _123 YNC. for -abc CaseD. 2a DO sizeofD 10. 存储以下数据,占用存储字节最多的是 ;A. 0B. ‘0’C. “0”D.D 11. 程序运行中需要从键盘上输入多于一个数据时,各数据之间应使用 符号作为分隔符;A. 空格或逗号B. 逗号或回车C. 逗号或分号D. 空格或回车C 12. 设”int a=12;”,则执行完语句”a+=aa;”后,a 的值是 ;A. 12B. 144C. 156D. 288D 13. 假设在程序中 a 、b 、c 均被定义成整型,所赋的值都大于1,则下列能正确表示代数式abc1的表达式是 ; A. abc B. 1/abc C. 1/a/b/floatc D. a/b/cD 14. 设”int a=15,b=26;”,则”cout<<a,b;”的输出结果是 ;A. 15B. 26,15C. 15,26D. 26C 15. 设x 是一个bool 型的逻辑量,y 的值为10,则表达式 x && y 的值为 ;A. 1B. 0C. 与x 值相同D. 与x 值相反A 16. x>0 && x<=10的相反表达式为 ;A. x<=0 || x>10B. x<=0 && x>10C. x<=0 || x<=10D. x>0 && x>10B 17. x>0 || y==5的相反表达式为 ;A. x<=0 || y=5B. x<=0 && y=5C. x>0 || y=5D. x>0 && y==5 A 18.设x和y均为bool量,则x && y为真的条件是 ;A. 它们均为真B. 其中一个为真C. 它们均为假D. 其中一个为假C 19.设x和y均为bool量,则x || y为假的条件是 ;A. 它们均为真B. 其中一个为真C. 它们均为假D. 其中一个为假B 20. 字符串”a+b=12\n”的长度为 ;A. 6B. 7C. 8D. 9B 21. 假定下列x和y均为int型变量,则不正确的赋值为 ;A. x+=y++B. x++=y++C. x=++yD. ++x=++yC 22. 下列的符号常量定义中,错误的定义是 ;A. const M=10;B. const int M=20;C. const char ch;D. const bool mark=true;C23. 循环语句“forint i=0; i<n; i++ cout<<ii<<’ ’;”中循环体执行的次数为 ;A. 1B. n-1C. nD. n+1B 24. 在下面循环语句中循环体执行的次数为 ;forint i=0; i<n; i++ifi>n/2 break;A. n/2B. n/2+1C. n/2-1D. n-1D 25. 在下面循环语句中内层循环体S语句的执行总次数为 ;forint i=0; i<n; i++forint j=i; j<n; j++ S;A. n2B. n+1/2C. nn-1/2D. nn+1/2C 26. 在下面循环语句中循环体执行的次数为 ;int i=0,s=0; whiles<20 {i++; s+=i;}A. 4B. 5C. 6D. 7A 27. 在下面循环语句中循环体执行的次数为 ;int i=0; do i++; whileii<10;A. 4B. 3C. 5D. 2A 28. 当处理特定问题时的循环次数已知时,通常采用来解决;A. for循环B. while循环C. do循环D. switch语句C 29. 循环体至少被执行一次的语句为 ;A. for循环B. while循环C. do循环D. 任一种循环B 30. switch语句能够改写为语句;A. forB. ifC. doD. whileD 31. do语句能够改写为语句;A. 复合B. ifC. switchD. whileC 32. 在下面的一维数组定义中,哪一个有语法错误;A. int a={1,2,3};B. int a10={0};C. int a;D. int a5;D 33. 在下面的字符数组定义中,哪一个有语法错误; ;A. char a20=”abcdefg”;B. char a=”x+y=55.”;C. char a15;D. char a10=’5’;C 34. 在下面的二维数组定义中,正确的是 ;A. int a5;B. int a5;C. int a3={{1,3,5},{2}};D. int a10;C 35. 假定一个二维数组的定义语句为“int a34={{3,4},{2,8,6}};”,则元素a12的值为 ;A. 2B. 4C. 6D. 8A 36. 假定一个二维数组的定义语句为“int a34={{3,4},{2,8,6}};”,则元素a21的值为 ;A. 0B. 4C. 8D. 6B 37. 若定义了函数 double function, 则函数function的返回值为 ;A. 实数型B.实数的地址C.指向函数的指针D.函数的地址B 38. 以下说法中正确的是 ;A. C++程序总是从第一个定义的函数开始执行B. C++程序总是从main函数开始执行C. C++函数必须有返回值,否则不能使用函数D. C++程序中有调用关系的所有函数必须放在同一个程序文件中C 39. 以下叙述中不正确的是 ;A. 在一个函数中,可以有多条return语句B. 函数的定义不能嵌套,但函数的调用可以嵌套C. 函数必须有返回值D. 不同的函数中可以使用相同名字的变量A 40. 函数重载是指 ;A. 两个或两个以上的函数取相同的函数名,但形参的个数或类型不同B. 两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同C. 两个以上的函数名字不同,但形参的个数或类型相同D. 两个以上的函数取相同的函数名,并且函数的返回类型相同C 41. 以下关于函数模板叙述正确的是 ;A. 函数模板也是一个具体类型的函数B. 函数模板的类型参数与函数的参数是同一个概念C. 通过使用不同的类型参数,函数模板可以生成不同类型的函数D. 用函数模板定义的函数没有类型C 42. 下列的调用方式是引用调用;A. 形参和实参都是变量B.形参是指针,实参是地址值C. 形参是引用,实参是变量D.形参是变量,实参是地址值A 43. 为了提高程序的运行速度,可将不太复杂的功能用函数实现,此函数应选择 ;A. 内联函数B.重载函数C.递归函数D.函数模板B 44. 函数原型语句正确的是 ;A. int Functionvoid a; Function int;C. int Functiona; intdouble a;B 45. C++中函数返回值的类型是由决定的;A. return语句中表达式的类型B.该函数定义时的类型C.调用函数时的调用语句D.系统根据结果A 46. 以下函数的返回结果是 ;int functionchar x {char p=x; whilep++; returnp-x-1;}A. 求字符串的长度B.将字符串x连接到字符串p后面C. 将字符串x复制到字符串p中D.将字符串x反向存放B 47. 函数调用funcexp1,exp2,exp3,exp4,exp5中所含实参的个数为个;C. 4D. 5B 48. 设有如下函数定义int fchar s {char p=s;whilep=’\0’ p++;returnp-s;}在主函数中用cout<<f“good”调用上述函数, 则输出结果为 ;A. 3B. 4C. 5D. 6C 49. 以下正确的函数原型语句是 ;A. double funint x,int yB. double funint x;int yC. double funint,int;D. double funint x,y;B 50. 以下正确的说法是 ;A. 用户调用标准库函数前,必须重新定义B. 用户可以重新定义标准库函数,若如此,该函数将失去原有含义C. 系统不允许用户重新定义标准库函数D. 用户调用标准库函数前,不必使用预编译命令将该函数所在文件包括到用户源文件中D 51. 函数调用不可以 ;A. 出现在一个表达式中B. 出现在执行语句中C. 作为一个函数的实参D. 作为一个函数的形参B 52. 以下正确的描述是 ;A. 函数的定义可以嵌套,函数的调用不可以嵌套B. 函数的定义不可以嵌套,函数的调用可以嵌套C. 函数的定义和函数的调用均可以嵌套D. 函数的定义和函数的调用均不可以嵌套A 53. 若用数组名作为函数调用的实参,传递给形参的是 ;A. 数组的首地址B. 数组中第一个元素的值C. 数组全部元素的值D. 数组元素的个数D 54. 以下错误的描述是 ;A. 被调用函数中可以不用return语句B. 被调用函数中可以用多个return语句C. 被调用函数中,如果有返回值,就一定要有return语句D. 被调用函数中,一个return语句可返回多个值给调用函数C 55. 以下正确的描述是 ;A. 不允许设置参数的默认值B. 设置参数的默认值只能在定义函数时设置C. 设置参数的默认值时,应该设置右边的参数D. 设置参数的默认值时,应该全部参数都设置D 56. 采用重载函数的目的是 ;A. 实现共享B. 减少空间C. 提高速度D. 使用方便,提高可读性C 57. 将两个字符串连接起来组成一个字符串时,选用函数;A. strlenB. strcapC. strcatD. strcmpB 58. 以下叙述中正确的是 ;A. 使用define可以为常量定义一个名字,该名字在程序中可以再赋另外的值B. 使用const定义的常量名有类型之分,其值在程序运行时是不可改变的C. 在程序中使用内联函数使程序的可读性变差D. 在定义函数时可以在形参表的任何位置给出缺省形参值C 59. 下面的标识符中, 是文件级作用域;A. 函数形参B.语句标号C.外部静态类标识符D.自动类标识符D 60. 以下叙述不正确的是 ;A. 宏替换不占用运行时间B. 宏名无类型C. 宏替换只是字符替D. 宏名必须用大写字母表示D 61. C++语言的编译系统对宏命令的处理是 ;A. 在程序运行时进行B. 在程序连接时进行C. 和C++程序的其它语句同时进行编译D. 在对源程序中其它成分正式编译之前进行B 62. 当include后面的文件名用双引号括起来时,寻找被包含文件的方式是 ;A. 直接按系统设定的标准方式搜索目录B. 先在源程序所在目录搜索,再按系统设定的标准方式搜索目录C. 仅仅搜索源程序所在目录D. 搜索当前逻辑盘上的所有目录A 63. 当include后面的文件名用尖括号括起来时,寻找被包含文件的方式是 ;A. 直接按系统设定的标准方式搜索目录B. 先在源程序所在目录搜索,再按系统设定的标准方式搜索目录C. 仅仅搜索源程序所在目录D. 搜索当前逻辑盘上的所有目录C 64. 在下面存储类中, 对象的可见性与生存期不一致;A. 外部类B. 自动类C. 内部静态类D. 寄存器类A 65. 在下面存储类中, 的对象不是局部变量;A. 外部静态类B. 自动类C. 函数形参D. 寄存器类C 66. 关于局部变量,下面说法正确的是 ;A. 定义该变量的程序文件中的函数都可以访问B. 定义该变量的函数中的定义处以下的任何语句都可以访问C. 定义该变量的复合语句中的定义处以下的任何语句都可以访问D. 定义该变量的函数中的定义处以上的任何语句都可以访问C 67. 文件包含命令中被包含的文件的扩展名 ;A. 必须是.hB. 不能是.hC. 可以是.h或.cppD. 必须是.cppB 68. 预处理命令在程序中都是以符号开头的;A. B. C. & D.B 69. 设array为一个数组,则表达式sizeofarray/sizeofarray0的结果为 ;A. array数组首地址B. array数组中元素个数C. array数组中每个元素所占的字节D. array数组占的总字节数C 70. 用new运算符创建一个含10个元素的一维整型数组的正确语句是 ;A. int p=new a10;B. int p=new float10;C. int p=new int10;D. int p=new int10={1,2,3,4,5}A 71. 下列给字符数组赋初值时,正确的是 ;A. char s1=”abcdef”;B. char s24=”abcd”;C. char s323={“abc”,”xyz”};D. char s44={‘a’,’x’,’s’,’t’};D 72. 设有定义“static int data56;”,设该数组在静态存储区中的起始地址为十进制的100,若每个int型数占4个字节,则数组元素data23的地址为 ;A. 115B 73. 假定变量m定义为“int m=7;”,则定义变量p的正确语句为 ;A. int p=&m;B. int p=&m;C. int &p=m;D. int p=m;D 74. 假定k是一个double类型的变量,则关于变量p的正确定义语句为 ;A. double p=&k;B. int p=&k;C. double &p=k;D. char p=”Thank you”;A 75. 变量s的定义为“char s=”Hello world”;”,要使变量p指向s所指向的同一个字符串,则应选取 ;A. char p=s;B. char p=&s;C. char p;p=s;D. char p; p=&s;C 76. 关于void 指针,下列说法正确的是 ;A. void 指针就是未指向任何数据的指针B. void 指针就是已定义而未初始化的指针C. 指向任何类型数据的指针可直接赋值给一个void 指针D. void 指针值可直接赋给一个非void 指针D 77. 假定一条定义语句为“int a10, x, pa=a;”,若要把数组a中下标为3的元素值赋给x,则不正确的语句为 ;A. x=pa3;B. x=a+3;C. x=a3;D. x=pa+3;D 78. 假定有定义“int b10; int pb;”,则不正确的赋值语句为 ;A. pb=b;B. pb=&b0;C. pb=new int;D. pb=b5;C79. 假定p是具有double类型的指针变量,则表达式++p使p的值以字节为单位增加 ;A. 1B. 4C. sizeofdoubleD. sizeofpC 80. 假定p指向的字符串为”string”,则cout<<p+3的输出结果为 ;A. stringB. ringC. ingD. i四、问答题每题10分1.为什么称C++语言是混合型面向对象的语言答:一般真正的向对象语言具有抽象、封装、继承和多态性等特征,完全由一组抽象的对象组成,因此没有全局函数;而C++是在标准C语言的基础上引入“面向对象”概念而扩充形成的,严格地讲,它不是完全由一组抽象的对象类组成;因为C++程序中还有像main这样的全局函数,因此称它为混合型面向对象语言;2. 下面是一个联合的定义:Class CU {union {int ivalue;float fvalue;}下面是类C的定义:class C : public A, private B{private:int c;public:void setCint x, int y {c=x; setBy;}void showC {showB ; cout << c << endl;}};讨论类C属于何种方式的继承及其派生方法对访问基类成员的影响;答:类C是多重继承,它从类A 公有派生,因此,类A的公有保护的成员在类C中仍是公有的保护的;类C从类B私有派生,类B的所有成员在类C中是私有的;6. C++ 的流库预定义了哪几个流与这几个流所联结的具体设备是什么答:它们是cin、cout、cerr和clog,与C++的流类库预定义的四个流所联结的具体设备为:cin 与标准输入设备相关联cout 与标准输出设备相关联cerr 与标准错误输出设备相关联非缓冲方式clog 与标准错误输出设备相关联缓冲方式7. 在使用C++时,是否应仍然保持C语言的习惯及思维方式为什么答:不行;做为C语言的超集,C++在技术上是和C完全兼容的, 但它在概念上是和C语言完全不同的,因此,使用者应该学会按C++自己的方式来使用它,掌握C++的思维方式、设计方法和习惯;8.C++中有哪些机制可以实现命名常量答:第一个方法是定义const数据类型,它不但说明了数据,而且声明它是常量,即它的值不能改变;另外一个办法就是利用枚举;9. 简述模板类的动态特征;答:从类系的动态性能角度来看,模板类具有更多的动态特征;一旦完成一个继承类系的设计,它能处理的数据和处理数据的方法就确定了,除非新继承一个类来完成新的功能;模板类在设计完成之后,可以处理的数据类型却可以不断增加,并且模板类的实例可在编译时刻初始化,从而具有更好的灵活性;10 .简述静态成员的特性,然后就作用域与全局变量进行比较答:作为类的静态成员,它的特征是不管类创建了多少个对象,其静态成员都只有一个副本,这个副本为类的所有对象共享;类的静态成员不同于全局变量,全局变量的作用于为整个程序,静态成员只能在类的对象中有效;11.用指针或引用调用虚函数与通过对象访问虚函数的区别是答:使用一个基类型的指针或引用调用一个虚函数时候,c++使用动态联编,而通过对象访问时候,则使用静态联编;12. 多重继承的构造顺序一般可分为4步,下面给出这4个步骤:答:1: 任何虚拟基类的构造函数按照它们被继承的顺序构造;2: 任何非虚拟基类的构造函数按照它们被继承的顺序构造;3: 任何成员对象的构造函数按照它们声明的顺序构造;4: 类自己的构造函数;13. 在C++中,应该使用什么语句来动态分配和释放内存答:. new,delete14. 下面的程序的正确的输出结果是什么include <>include <>class base{。
c语言构造函数和析构函数
c语言构造函数和析构函数C语言构造函数和析构函数构造函数和析构函数是面向对象编程(OOP)中的重要概念。
它们用于在对象的创建和销毁过程中执行特定的操作。
然而,在C语言中并没有内置的构造函数和析构函数的概念,因为C语言不直接支持面向对象编程。
然而,我们可以通过一些技巧来模拟构造函数和析构函数的行为。
本文将逐步解释如何实现这些概念,并探讨构造函数和析构函数在C语言中的应用。
第一步:模拟构造函数构造函数在对象创建时被自动调用,用于初始化对象的成员变量。
在C语言中,我们可以通过在函数中手动分配内存并初始化对象来模拟构造函数的行为。
首先,我们需要定义一个结构体来表示我们要创建的对象。
结构体可以包含多个成员变量,每个成员变量代表对象的一个属性。
例如,我们可以创建一个学生对象,其中包含姓名和年龄两个成员变量。
ctypedef struct {char name[20];int age;} Student;接下来,我们可以编写一个创建学生对象的函数,该函数将分配内存并初始化学生对象的成员变量。
cStudent* createStudent(char* name, int age) {Student* student = (Student*)malloc(sizeof(Student));strcpy(student->name, name);student->age = age;return student;}在上述代码中,我们使用malloc函数分配了一块内存,大小足够容纳一个Student结构体。
然后,我们使用strcpy函数将传入的姓名参数复制到student对象的name成员变量中,使用赋值运算符初始化age成员变量。
最后,我们将指向新创建的学生对象的指针返回。
现在,我们可以调用createStudent函数来创建一个学生对象,并访问其成员变量。
cint main() {Student* student = createStudent("Tom", 20);printf("Name: s, Age: d\n", student->name,student->age);free(student);return 0;}在上述代码中,我们首先调用createStudent函数来创建一个学生对象,并将返回的指针赋给student指针。
c++ function的构造函数
一、构造函数的概念构造函数是一种特殊的成员函数,在C++中用来初始化类对象的数据成员。
当创建对象时,构造函数会被自动调用,用来初始化对象的数据成员。
构造函数的名字和类的名字相同,不返回任何值,也不带任何参数。
二、构造函数的特点1. 构造函数名与类名相同,没有返回类型2. 构造函数可以重载3. 每个类都有一个默认构造函数,如果用户没有定义构造函数,则编译器会自动生成一个默认的构造函数。
如果用户定义了构造函数,则默认构造函数就不会被自动生成。
4. 构造函数可以有默认参数5. 构造函数可以用explicit关键字声明为显式构造函数,禁止隐式转换三、构造函数的分类1. 默认构造函数默认构造函数是指不带任何参数的构造函数,如果用户没有定义构造函数,则编译器会自动生成一个默认的构造函数。
2. 带参数的构造函数带参数的构造函数可以根据不同的参数进行重载,用来初始化对象的数据成员。
3. 拷贝构造函数拷贝构造函数是一种特殊的构造函数,用来通过一个已存在的对象创建一个新对象,一般形参是对同类对象的引用。
四、构造函数的调用1. 构造函数在对象创建时自动调用,不能手动调用构造函数。
2. 创建对象时,可以给构造函数传递实参,用来初始化对象的数据成员。
3. 构造函数也可以被显式调用,通过new运算符创建对象时,会调用对象的构造函数。
五、构造函数的实现构造函数的实现通常放在类的头文件中,如果构造函数的实现比较复杂,也可以放在类的源文件中。
六、构造函数的注意事项1. 在C++中,构造函数可以被继承,子类对象的构造函数会调用父类的构造函数。
2. 构造函数不允许有返回值,即使是void类型的返回值也不行。
3. 构造函数不能被继承,子类不会继承父类的构造函数。
七、构造函数的示例下面是一个简单的示例,演示了一个带参数的构造函数的用法:```cpp#include <iostream>using namespace std;class Box {public:double length;double breadth;double height;// 构造函数Box(double l, double b, double h) {cout << "构造函数调用" << endl;length = l;breadth = b;height = h;}};int main() {// 使用构造函数创建对象Box box1(10.0, 5.0, 3.0);return 0;}```在上面的示例中,Box类有一个带参数的构造函数,当创建对象box1时,构造函数会被自动调用,用来初始化对象的数据成员。
C++标准教程08-3.类的构造函数
1-7
联系方式:
说明:无论深拷贝还是浅拷贝,都是需要的。当深拷贝发生时, 通常表明存在着一个“聚合关系”;而浅拷贝发生时,通常表明存在 着一个“相识关系”。
北京源智天下科技有限公司
1-8
联系方式:
构造函数调用顺序
类的构造函数
• • • • •
默认构造函数 限制对象创建 拷贝构造函数 深拷贝和浅拷贝 构造函数调用顺序
北京源智天下科技有限公司
1-1
联系方式:
默认构造函数
如果类中没有写构造函数,编译器会自动生成一个默认形式的构造函数, 这个默认的构造函数没有参数,也不做任何事情。如果类中显式声明了构造函 数,无论是否有参数,编译器都不会再为之生成任何形式的构造函数。 默认构造函数是指不需要用户指定实参就能够被调用的构造函数,这并不 意味着它不能接受实参,表示构造函数的每个参数都有一个默认值与之关联。 实例中没有定义与类Clock同名的成员函数(构造函数),此时编译系统就 会在编译时自动生成一个默认形式的构造函数,这个构造函数的功能是不做任 何事。编译器为什么会生成一个不做任何事的函数呢?这是因为在创建对象时 自动调用构造函数是C++程序的必然行为,是一个一般性的行为。对于这种方 式构造出来的对象,类成员变量是没有被初始化的,是程序运行栈中该内存上 一次被使用的结果,它们是不可预知的。
北京源智天下科技有限公司
1பைடு நூலகம்6
联系方式:
深拷贝和浅拷贝
假如在类中没有显式地声明一个拷贝构造函数,那么编译器将会自动生成一 个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝,也称为浅拷贝。自 定义拷贝构造函数是一种良好的编程风格,能够阻止编译器形成默认的拷贝构造 函数,提高源码效率。 在某些状况下,类内成员变量需要动态开辟堆内存,假如实行位拷贝(浅拷 贝),也就是把对象里的值完全复制给另一个对象,如A=B。此时,假如B中有一 个成员变量指针已申请了内存,那A中的那个成员变量也指向同一块内存。这就 出现了问题,当B的内存释放(如析构),此时A内的指针就是野指针了,当A也 试图去释放该指针时,就出现了运行错误。 深拷贝和浅拷贝可以简单理解为:假如一个类拥有资源,当这个类的对象发 生复制过程的时候,资源重新分配,这个过程就是深拷贝;反之,没有重新分配 资源,就是浅拷贝。浅拷贝就是成员数据之间的一一赋值。但是可能会有这样的 情况,对象还包含有资源,这里的资源可以指堆资源,或者一个文件。当进行值 拷贝的时候,两个对象就共用相同的资源,同时都具有对资源的访问权限,这样 就可能会出现资源共享的问题。深拷贝就是用来解决这种问题的,它把资源也赋 值一次,使对象拥有不同的资源,但资源的内容相同。对于堆资源来说,就是再 开辟一块大小相同的新堆内存,把原来的内容复制到新内存中。
C++知识点总结
类和对象初步1.类的定义在定义外成员函数的实现2.类的成员函数之间可以相互调用,类的成员函数也可以重载,也可设默认参数值3.一般来讲,一个对象占用的内存空间的大小等于其成员变量的体积之和。
每个对象都有自己的存储空间(成员变量),但成员函数只有一份对象名.成员名指针->成员名引用名。
成员名4.private:一个类的私有成员,只能在该类的成员函数中才能访问public: proteced:5.class默认private struct默认public6.内联成员函数:成员函数名前加inline 或函数体写在类定义内部的成员函数.执行更快,但会带来额外的内存开销构造函数1.构造函数全局变量在堆上,系统自动初始化为零。
局部变量在栈上,初始值是随机的,需要初始化。
2.构造函数:对对象进行初始化。
构造函数执行时对象的内存空间已经分配,构造函数的作用是初始化这片空间.可重载,不写的话有默认构造函数,但是如果编写了构造函数,那默认构造函数不会再执行。
是一类特殊的成员函数。
不写返回值类型,函数名为类名.3.对象在生成时一定会调用某个构造函数,一旦生成,不再执行构造函数。
4.P183 Ctest *pArray[3]={new Ctest(4),new Ctest(1,2)}5.复制构造函数:其是构造函数的一种,只有一个参数,为本类的引用,防止混淆,构造函数不能以本类的对象作为唯一的参数。
默认复制构造函数。
6.复制构造函数被调用的三种情形:1用一个对象去初始化另一个对象时Complex C1(C2) ComplexC2=C1;2 函数的参数是类A的对象。
形参未必等于实参函数中用对象的引用不会调用复制构造函数void Function(const Complex &c)3 函数的返回值是类A的对象7.类型转换构造函数:除复制构造函数外,只有一个参数的构造函数C=68.析构函数:在对象消亡时调用,可以定义其做善后工作。
大学C期末考试题库
2011年大学C++期末考试题库一、单选题:1. 能作为C++程序的基本单位是( )。
A. 字符B. 语句C. 函数D. 源程序文件2. 程序中主函数的名字为( )。
A. mainB. MAINC. MainD. 任意标识符3. 关于C++与C 语言的关系的描述中,( )是错误的。
A. C 语言是C++的一个子集;B. C 语言与C++是兼容的;C. C++对C 语言进行了一些改进;D. C++和C 语言都是面向对象的4. 可用作C++语言用户标识符的一组标识符是( )。
A. void define +WORDB. a3_b3 _123 YNC. for -abc CaseD. 2a DO sizeof5. 存储以下数据,占用存储字节最多的是( )。
A. 0B. ‘0’C. “0”D. 0.06. 设int a=12;则执行完语句a+=a*a ;后,a 的值是( )。
A. 12B. 144C. 156D. 2887. 假设在程序中 a 、b 、c 均被定义成整型,所赋的值都大于1,则下列能正确表示代数式abc1的表达式是( )。
A. 1.0/a*b*c B. 1/(a*b*c) C. 1/a/b/(float)c D. 1.0/a/b/c8. 以下说法中正确的是( )。
A. C++程序总是从第一个定义的函数开始执行B. C++程序总是从main 函数开始执行C. C++函数必须有返回值,否则不能使用函数D. C++程序中有调用关系的所有函数必须放在同一个程序文件中9. 下面有关构造函数的描述中,正确的是( )。
A. 构造函数可以带有返回值B. 构造函数的名字与类名完全相同C. 构造函数必须带有参数D. 构造函数必须定义,不能缺省10.在声明类时,下面的说法正确的是( )。
A. 可以在类的声明中给数据成员赋初值B. 数据成员的数据类型可以是registerC. private ,public ,protected 可以按任意顺序出现D. 没有用private ,public ,protected 定义的数据成员是公有成员11.在下面有关析构函数特征的描述中,正确的是( )。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//设计并测试一个名为Ellipse的椭圆类,其属性为其圆心坐标以及半长轴和半短轴的长度//设计一个构造函数对这些属性进行初始化,并通过成员函数计算出椭圆的面积。
#include <iostream>
using namespace std;
class Point
{
int x,y;
public:
void SetPoint(int a,int b);
void Print();
};
void Point::SetPoint(int a,int b)
{
x=a;
y=b;
}
void Point::Print()
{
cout<<'('<<x<<","<<y<<')'<<endl;
}
class Ellipse
{
int Long,Short;
Point Center;
public:
Ellipse(int a,int b,Point c);
double Area();
void Print();
};
Ellipse::Ellipse(int a,int b,Point c)
{
Long=a;
Short=b;
Center=c;
}
double Ellipse::Area()
{
return 3.14159*Long*Short;
}
void Ellipse::Print()
{
cout<<"圆心坐标为:";
Center.Print();
cout<<"长半轴为:"<<Long<<'\t'<<"短半轴为:"<<Short<<endl;
}
int main()
{
Point center;
center.SetPoint (0,0);
Ellipse m(4,3,center);
m.Print();
cout<<"椭圆的面积为:"<<m.Area()<<endl;
return 0;
}。