文档库 最新最全的文档下载
当前位置:文档库 › C++类成员的初始化

C++类成员的初始化

C++类成员的初始化
C++类成员的初始化

1、关于构造函数1)用构造函数确保初始化对于一个空类[cpp]view plaincopyprint?

1. class Empty{};编译器会自动声明4个默认函数:构造函数,拷贝构造函数,赋值函数,析构函数(当然,如果不想使用自动生成的函数,就应该明确拒绝),这些生成的函数都是public且inline。构造函数对数据成员进行初始化,使用未初始化值可能导致无法预知的错误,所以,确保每一个构造函数都将每一个成员初始化。2)为什么构造函数不能有返回值如果有返回值,要么编译器必须知道怎么处理返回值,要么就客户程序员显式调用构造函数和析构函数,这样,还有安全性么?3)为什么构造函数不能为虚函数简单来说,虚函数调用的机制,是知道接口而不知道其准确对象类型的函数,但是创建一个对象,必须知道对象的准确类型;当一个构造函数被调用时,它做的首要事情之一就是初始化它的VPTR 来指向VTABLE。4)构造函数的一个面试题:[cpp]view plaincopyprint?

#include

using namespace std;

class Base

{

private:

int i;

public:

Base(int x)

{

i=x;

}

};

class Derived:public Base

{

private:

int i;

public:

Derived(int x,int y)

{

i=x;

}

void print()

{

cout<

}

};

int main()

{

Derived A(2,3);

A.print();

}#include

using namespace std;

class Base

{

private:

int i;

public:

Base(int x)

{

i=x;

}

};

class Derived:public Base

{

private:

int i;

public:

Derived(int x,int y)

{

i=x;

}

void print()

{

cout<

}

};

int main()

{

Derived A(2,3);

A.print();

return 0;

}首先,是访问权限问题,子类中直接访问Base::i是不允许的,应该将父类的改为protected 或者public(最好用protected)其次,统计父类和子类i的和,但是通过子类构造函数没有对父类变量进行初始化;此处编译会找不到构造函数,因为子类调用构造函数会先找父类构造函数,但是没有2个参数的,所以可以在初始化列表中调用父类构造函数最后个问题,是单参数的构造函数,可能存在隐式转换的问题,因为单参数构造函数,和拷贝构造函数形式类似,调用时很可能会发生隐式转换,应加上explicit关键字,修改后如下(程序员面试宝典上只改了前2个)[cpp]view plaincopyprint?

#include

using namespace std;

{

protected:

int i;

public:

explicit Base(int x)

{

i=x;

}

};

class Derived:public Base {

private:

int i;

public:

Derived(int x,int y):Base(x) {

i=y;

}

void print()

{

cout<

}

};

int main()

{

Derived A(2,3);

A.print();

return 0;

}#include using namespace std;

class Base

{

protected:

int i;

public:

explicit Base(int x)

{

i=x;

}

};

class Derived:public Base

{

private:

int i;

public:

Derived(int x,int y):Base(x)

{

i=y;

}

void print()

{

cout<

}

};

int main()

{

Derived A(2,3);

A.print();

return 0;

}2、初始化列表1)使用初始化列表提高效率常用的初始化可能如下:[cpp]view plaincopyprint?

class Student

{

public:

Student(string in_name,int in_age)

{

name=in_name;

age=in_age;

}

private:

string name;

int age;

};class Student

{

public:

Student(string in_name,int in_age)

{

name=in_name;

age=in_age;

}

private:

string name;

int age;

};以前楼主也习惯这么写,可以达到预期效果,不过不是最佳做法,因为在构造函数中,是

对name进行赋值,不是初始化,而string对象会先调用它的默认构造函数,再调用string 类(貌似是basic_string类)的赋值构造函数;对于上例的age,因为int是内置类型,应该是赋值的时候获得了初值。要对成员进行初始化,而不是赋值,可以采用初始化列表(member initialization list)改写为如下:[cpp]view plaincopyprint?

class Student

{

public:

Student(string in_name,int in_age):name(in_name),age(in_age){}

private:

string name;

int age;

};class Student

{

public:

Student(string in_name,int in_age):name(in_name),age(in_age){}

private:

string name;

int age;

};结果与上例相同,不过在初始化的时候调用的是string的拷贝构造函数,而上例会调用两次构造函数,从性能上会有不小提升有的情况下,是必须使用初始化列表进行初始化的:const对象、引用对象2)初始化列表初始顺序考虑以下代码:[cpp]view plaincopyprint?

#include

using namespace std;

class Base

{

public:

Base(int i):m_j(i),m_i(m_j){}

Base():m_j(0),m_i(m_j){}

int get_i()const

{

return m_i;

}

int get_j()const

{

return m_j;

}

private:

int m_i;

int m_j;

};

int main()

{

Base obj(98);

cout<

return 0;

}#include

using namespace std;

class Base

{

public:

Base(int i):m_j(i),m_i(m_j){}

Base():m_j(0),m_i(m_j){}

int get_i()const

{

return m_i;

}

int get_j()const

{

return m_j;

}

private:

int m_i;

int m_j;

};

int main()

{

Base obj(98);

cout<

return 0;

}输出为一个随机数和98,为什么呢?因为对于初始化列表而言,对成员变量的初始化,是严格按照声明次序,而不是在初始化列表中的顺序进行初始化,如果改为赋值初始化则不会出现这个问题,当然,为了使用初始化列表,还是严格注意声明顺序吧,比如先声明数组大小,再声明数组这样。总结完毕,望有用

C++程序设计复习题及参考答案

《C++程序设计》课程复习资料 一、单项选择题: 1.下列字符串中可以用作C++标识符的是[ ] -ld 2.定义变量int a=6,则a++的值是[ ] .6 C 3.已知字母A的ASCII码为65,则表示字符常量A 错误的是[ ] A. '\101' B. '\x41' C. 65 D.“A” 4.结构化程序由三种基本结构组成,不包括[ ] A.顺序结构 B.选择结构 C.控制结构 D.循环结构 5.己知有定义: const int D 5; int i=1; double f=; char c=15; 则下列选项错误的是[ ] A.++i; B. D--; C. c++; D. --f; 6.若有定义为“int *r =new int [10];”,则释放指针所指内存空间的操作是[ ] A. delete [ ]r; B. delete *r C. delete r; D. delete r[ ]; 7.下列哪个是C++语言的不正确的标识符[ ] B. Ab1 C. bgc D. int 8.下列哪个是C++语言的合法的字符常量[ ] A. ”\0” B. '054' C. '\x89' D. '\092' 9.定义整型变量x,y,z并赋初始值6的正确语句是[ ] A. int x=y=z=6; B. int x=6,y=6,z=6; C. x=y=z=6; D. int x,y,z=6; 10.用C++语言编写的代码程序[ ] A.可立即执行 B.是一个源程序 C.经过编译即可执行 D.经过解释才能执行 11.将两个字符串连接起来组成一个字符串时,选用的函数是[ ] A. strlen () B. strcpy () C. strcat () D. strcmp () 12.在程序中,预处理命令开头的字符都是[ ] A. * B. # C. & D. @ 13.在C++语言中,表示一条语句结束的符号是[ ] A. “#” B. “;” C. “}” D. “下面的循环语句中循环体执行的次数为 [ ] for(int i=0; in/2) break; 2 2+1 C.n/2-1 15.在下面的一维数组定义中,有语法错误的语句是[ ] A. int a[ ]={1,2,3}; B. int a[10]={0}; C. int a[ ]; D. int a[5]; 16.下面的保留字中,不能作为函数的返回类型[ ] A. void B. int C. new D. long 17.下面的函数声明中,“void BC(int a, int b);”的重载函数是[ ] A. int BC(int x, int y); B. void BC(int a, char b); C. float BC(int a, int b, int c=0); D. int BC(int a, int b=0); 18.假定AB为一个类,则该类的复制构造函数的声明语句为[ ] A. AB&(AB x); B. AB(AB x); C. AB(AB* x); D. AB(AB&);

C语言-基础教程-数组的初始化

C语言-基础教程-数组的初始化 5.4.1 数组初始化 C语言允许在说明时对全局数组和静态局部数组初始化,但不能对非静态局部数组初始化。 与其它变量相似,数组初始化的一般形式如下: type-specifier array_name[size1]...[sizen]={value-list}; 数值表是一个由逗号分隔的常量表。这些常量的类型与类型说明相容,第一个常量存入数组的第一个单元,第二个常量存入第二个单元,等等,注意在括号" }"后要加上分号。 下列中一个1 0元素整型数组被初始化装入数字1到1 0: int i[10]={1,2,3,4,5,6,7,8,9,1 0 } ; 这意味着i [ 0 ]的值为1,而i [ 9 ]的值为1 0。 存放字符串的字符数组的初始化可采用如下简化的形式: char array_name[size] = "sing"; 例如,以下代码段将s 初始化为" h e l l o"。 char s[6] = "hello"; 上面代码产生和下面代码相同的结果: char s[6]={'h',' e ' ,' l ' ,' l ' ,' o ' ,' \ o ' } ; 因为C语言中的字符串都以空( N U L L)字符为终结,故要确认定义的数组足够长以存放空字符。这就是为什么h e l l o只有5个字符,而s 要有6个字符长的原因。使用字符串常量时,编译程序自动地在末尾加上空字符。 多维数组初始化的方法与一维数组相同,例如,下式将s q r s初始化为从1到1 0及它们各自的平方数。 int sqrs[10][2]={ 1,1, 2,4, 3,9, 4,1 6 ,

[科普]C执行顺序

C# 类的初始化顺序 继承类的static数据成员的初始化器, 继承类的static构造器 (在类名, 第一次被引用时, 调用, 如果, 没有这个构造器, 则static数据成员何时被初始化, 是不可预测的) 继承类的实例型数据成员的初始化器 在执行继承类的构造器的内容之前; 基类的static数据成员的初始化器即 static int a = 1; /// 类数据成员的定义 基类的static 构造器 ,(如果,基类的类名, 先于继承类被引用, 则先执行基类的static构造器) 基类的实例型数据成员的初始化器 基类的构造器 接着执行继承类的构造器的内容; Example : public class Base { A: private static int Number = 12; B: private int localNumner = 1; C: static Base() { /// } D: public Base() { } }

public class Child : Base { E: private static int ChildNumber = 14; F: private int local_child_number = 7; G: static Child() { /// } H: public Child() { I: /// } } Child child = new Child(); 初始化顺序为 E G F H A C B D I; static构造器的调用时刻是, 第一次引用该类的类名; public class Test { static Test() { } public staitc int Account { get { return 1; } } /// 只是举例 public static int GetAccount() { return 1;

数组的两种初始化方式

数组的两种初始化方式 来源 一维数组初始化 可以使用两种方式对数组进行初始化: int[] a = {1,2,3,4,5,}; //最后一个元素的“,”可有可无 int[] a = new int[5]; //数组中5个元素默认为0 对于第二种方式,也可以指定元素的值: int[] a = new int[]{1,2,3,4,5}; 如果未指定元素的值,那么元素会存在一个默认值,数值型为0,布尔型为false,引用类型为null。因为数组也是对象,所以数组元素的默认值与类中定义的变量默认值相同。如果指定了元素的值,就不能在[]中指定数组的大小,例如不能写成: int[] a = new int[5]{1,2,3,4,5}; //错误 第二种方式可以在声明后使用,第一种方式只能与声明同时使用,例如: 多维数组初始化 在Java中多维数组可以是不规则的(每组的元素个数可以不同),在为多维数组分配空间时,一定要从高到低维分配。因为多维数组实际上就是数组的数组,即高维数组的每个元素也是数组,如果数组(高维)还没有分配空间,便无法为数组中的元素(低维)分配空间。 例如: int[][] a = new int[3][]; //先分配高维,不能写成int[][] a = new int[][3]; //高维数组的每个元素(即a[0],a[1],a[2])也是数组 a[0] = new int[2]; a[1] = new int[3]; a[2] = new int[4]; 对于矩阵数组(每维的元素个数都相等),可以采用一种简便的分配方式: int[][][] a = new int[3][4][5]; 上面的代码分配了一个三维数组,该数组有3个元素,每个元素是一个二维数组,每个二维数组有4个元素,每个元素是一个一维数组,每个一维数组有5个元素,每个元素为int 类型。

账号密码及权限管理制度

XXXX公司 账号密码及权限管理制度 1总则 1.1 目的 为加强公司信息系统账号和密码管理,通过控制用户密码、权限,实现控制访问权限分配,防止对公司网络的非授权访问,特制订本管理办法。 1.2 范围 所有使用本公司网络信息系统的人员。 1.3 职责 公司所有使用信息系统的人员均需遵守本管理办法规定。行政部网络工程人员负责建立账号和密码管理的规范并推动执行、审核和检查落地执行情况。 1.4 术语和定义 内部网络:是指在本公司内部所有客户端等组成的局域网。包括但不限于OA 系统以及数据库系统等。 2控制内容 1.1 用户注册 ?新用户必须加入域,否则不允许入网。 ?域用户账号由网络管理员在该用户上岗使用公司网络系统前建立,命名 原则为职工工号。

?一自然人对应一个系统账号,以便将用户与其操作联系起来,使用户对 其操作行为负责。 ?用户因工作变更或离开公司时,管理员要及时取消或者锁定该用户所有 账号,对于无法锁定或者删除的用户账号采用更改密码等相应的措施规 避风险。 ?系统管理员应定期检查并取消多余的用户账号。 1.2 权限管理 ?行政部系统管理员负责分配新用户系统权限,负责审批用户权限变更申 请是否与信息安全策略相违背。 ?特权用户必须按授权程序通过系统等部门主管批准,才可给予相应的权 限。 ?系统管理员应保留所有特权用户的授权程序与记录。 ?权限设定要明细化,尽可能减少因拥有的权限化分较粗带来的不正当信 息访问或误操作等现象的发生。若某些权限无法细分,则需加强对用户 的单独监控。 ?只有工作需要的信息访问要求,才可授权。每个人分配的权限以完成本 岗位工作最低标准为准。 ?系统管理员对分配的所有权限记录进行维护。不符合授权程序,则不授 予权限。 ?对于本公司外的用户,需要访问本公司内部资源时,需要由用户的接待 者申请为其办理授审批程序。 1.3 密码的选择 密码的选择应参考以下规则:

C++类成员的访问权限

前面我们在定义类时多次使用到了public 关键字,表示类的成员具有“公开”的访问权限,这节我们就来详细讲解。 C++通过public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。 Java、C# 程序员注意,C++ 中的public、private、protected 只能修 饰类的成员,不能修饰类,C++中的类没有共有私有之分。 在类的内部(定义类的代码内部),无论成员被声明为public、protected 还是private,都是可以互相访问的,没有访问权限的限制。 在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问public 属性的成员,不能访问 private、protected 属性的成员。 本节重点讲解public 和private,protected 将在继承中讲解。 下面通过一个Student 类来演示成员的访问权限: 1.#include https://www.wendangku.net/doc/ca7840587.html,ing namespace std; 3. 4.//类的声明 5.class Student{ 6.private://私有的 7.char*m_name; 8.int m_age; 9.float m_score;

10. 11.public://共有的 12.void setname(char*name); 13.void setage(int age); 14.void setscore(float score); 15.void show(); 16.}; 17. 18.//成员函数的定义 19.void Student::setname(char*name){ 20.m_name = name; 21.} 22.void Student::setage(int age){ 23.m_age = age; 24.} 25.void Student::setscore(float score){ 26.m_score = score; 27.} 28.void Student::show(){ 29.cout<setname("李华"); 43.pstu ->setage(16);

C类构造函数初始化列表

类构造函数初始化列表 初始化列表地定义在使用编程地过程当中,常常需要对类成员进行初始化,通常地方法有两种:一种是构造函数内对类地成员赋值,一种则是使用初始化列表地构造函数显式地初始化类地成员. 构造函数初始化列表以一个冒号开始,接着是以逗号分隔地数据成员列表,每个数据成员后面跟一个放在括号中地初始化式.例如:{ : ; ; 构造函数初始化列表(): ()() {} 构造函数内部赋值() { ; ; } }; 从技术上说,用初始化列表来初始化类成员比较好,但是在大多数情况下,两者实际上没有什么区别.第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑初始化列表地必要性初始化和赋值对内置类型地成员没有什么大地区别,像上面地任一个构造函数都可以.但在一些情况下,初始化列表可以做到构造函数做不到地事情: 、类里面有类型地成员,它是不能被赋值地,所以需要在初始化列表里面初始化它; 、引用类型地成员(也就是名字成员,它作为一个现有名字地别名),也是需要在初始化列表里面初始化地,目地是为了生成了一个其名字成员在类外可以被修改而在内部是只读地对象;

、需要调用基类地构造函数,且此基类构造函数是有参数地; 、类里面有其他类类型地成员,且这个“其他类”地构造函数是有参数地. 举个例子:设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数地构造函数. { : ( ) { ... } }; 因为有一个显式声明地构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建地一个实例. * ; 出错!! * (); 如果是另一个类地成员,你怎样初始化它呢?答案是你必须使用成员初始化列表. { ; : (); }; 必须使用初始化列表来初始化成员 () : () {……} 没有其它办法将参数传递给. 情况和其实一样地道理.如果成员是一个常量对象或者引用也是一样.根据地规则,常量对象和引用不能被赋值,它们只能被初始化. 初始化列表与构造函数赋值地效率比较首先把数据成员按类型分类并分情况说明: .内置数据类型,复合类型(指针,引用) 在成员初始化列表和构造函数体内进行,两者在性能和结果上都是一样地 .用户定义类型(类类型) 两者在结果上相同,但是性能上存在很大地差别. 因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以对于用户自定义类型(类),在初始化列表中只会调用类地构造函数,在构造函数体中赋值就会先调用一次类地构造函数,然后再调用一次类地赋值操作符函数. 显然后者在性能上有所损失,特别对于构造函数和赋值操作符都需要分配内存空间地情况,使用初始化列表,就可以避免不必要地多次内存分配. 举个例子:假定你有一个类具有一个类型地成员,你想把它初始化为" .".你有两种选择: 、使用构造函数赋值()

操作权限管理制度

操作权限管理制度 权限指在计算机系统中某一用户的访问级别和权利,包括所能够执行的操作及所能访问的数据。为了更好的明确责任及操作权限,避免由于操作权限不明确而造成的损失,特制定本制度。 一、权限管理职责 1.计算机专责员要建立本单位的操作权限用户清单和权限列表。 2.计算机操作权限分级: 1)A级权限:计算机的系统操作、数据上传下载、程序变更等高级操作,由各单位主管领导进行审批。 2)B级权限:计算机数据的查看、监控,由各单位计算机专责员进行审批。 3.只有经审批拥有A级、B级权限的人员,方可对计算机进行相应权限的操作或数据查看,不可越级操作,如因权限不明,造成损失的,要追究权限人及审批人的责任。 4.拥有相应操作权限的工作人员,要对所使用的账户信息负责,不得随意将账户交给或借予他人使用,如因紧急情况需将账户信息交由他人使用的,要报由专责员现场进行监督,使用后权限人要及时更改账户信息,避免造成不必要的损失,因账户信息外流而造成损失的,

要追究权限人及审批人的责任。 二、用户新增\变更\注销管理流程 1.权限新增\变更流程 1)由用户本人提出申请,填写《权限新增\变更\注销申请表》(见附表1)。 2)申请人所属单位计算机专责员核准,确认权限级别,A级权限需报单位主管领导审批,并加盖公章。 2.权限注销流程 工作人员由于工作变动、调动或离职等原因需要对工作人员的访问权限进行修改或注销时: 1)填写《权限申请/变更/注销审批表》,由单位计算机专责员 2)专责员根据《权限申请/变更/注销审批表》进行用户的注销,维护操作权限用户清单和权限列表; 3)非正常离职的工作人员,专责员要及时注销该员工的账户权限。 3.审批后的权限有效期限默认为一年,期满后要重新进行申请。专责员及时清理到期未申请的账户。 附录: 附表1:《权限申请/变更/注销审批表》

数据结构实验

实验1:顺序表基本操作 一、实验目的 1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表 的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集 等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.编写程序实现顺序表的下列基本操作: (1)初始化顺序表La。 (2)将La置为空表。 (3)销毁La。 (4)在La中插入一个新的元素。 (5)删除La中的某一元素。 (6)在La中查找某元素,若找到,则返回它在La中第一次出现的位置, 否则返回0。 (7)打印输出La中的元素值。 2.编写程序完成下面的操作: (1)构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列。 (2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列。 (3)假设两个顺序线性表La和Lb分别表示两个集合A和B,利用 union_Sq操作实现A=A∪B。 四、思考与提高 假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B ? 实验2:单链表基本操作 一、实验目的 1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体 的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 二、实验要求

1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La。 (2)在La中第i个元素之前插入一个新结点。 (3)删除La中的第i个元素结点。 (4)在La中查找某结点并返回其位置。 (5)打印输出La中的结点元素值。 2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、 Lb合并成一个有序单链表Lc。 合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc 之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。 3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。 (即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。) 四、思考与提高 1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点? 实验3:循环队列基本操作 一、实验目的 1.熟悉并能实现循环队列的定义和基本操作。 2.了解用队列解决实际应用问题。 二、实验要求 1.进行队列的基本操作时要注意队列“先进先出”的特性。 2.复习关于队列操作的基础知识。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容 1.任意输入队列长度和队列中的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。

java数组初始化详解_修正版

动态初始化:创建数组时,由系统默认地为数组中的元素赋初值,你指定数组长度 静态初始化:创建数组时,程序员显式地为数组中的元素赋初值,你不指定数组长度 数组的隐式初始化:因为数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。 一维数组 1) int[] a; //声明,没有初始化 int a[]; a[0]=1; //错误,因为数组没有初始化,不能赋值 a[1]=2; 2) int[] a=new int[5]; //初始化为默认值,int型为0(动态) int[] a; a=new int[5]; //正确,两种写法一样 3) int[] a={1,2,3,4,5}; //初始化为给定值(静态) int[] a; a={1,2,3,4,5}; //错误,数组常量只能在初始化操作中使用,如上 4) int[] a=new int[]{1,2,3,4,5}; //同(3) (静态) int[] a=new int[5]{1,2,3,4,5}; //错误,如果提供了数组初始化操作,则不能定义维表达式 二维数组 1) int[][] a; //声明,没有初始化 2) int[][] a=new int[2][3]; //初始化为默认值,int型为0 3) int[][] a={{1,2},{2,3},{3,4}}; //初始化为给定值 int[][] a={{1,2},{2,3},{3,4,5}}; //没有错,数组空间不是连续分配的,所以不要求每一维的大小相同 4) int[][] a=new int[2][]; a[0]=new int[3]; //a[0]其实就是一个数组 a[1]=new int[4]; //每一维的大小可以不一样;

java题

二、编写程序题 1、按以下要求编写程序 (1) 创建一个Rectangle类,添加width和height两个成员变量 (2) 在Rectangle中添加两种方法分别计算矩形的周长和面积 (3) 编程利用Rectangle输出一个矩形的周长和面积 public class Rectangle{ double width; double length; public Rectangle(){ this.width=width; this.length=length; } public double zhouzhang(){ return (width+length)*2; } public double mianji(){ return width*length; } public static void main(String[] args){ Rectangle R=new Rectangle(); System.out.println("周长为:"+R.zhouzhang()); System.out.println("面积为:"+R.mianji()); } } 运行结果: 周长为:0.0 面积为:0.0 2、按以下要求编写程序 (1) 编写Animal接口,接口中声明run() 方法 (2) 定义Bird类和Fish类实现Animal接口 (3) 编写Bird类和Fish类的测试程序,并调用其中的run()方法 3、设计类A和A的派生类B,要求: 1)A有两个数据成员a和b(都为int型);B中继承了A中的a和b,又定义了自己的数据成员c(int型)。 2)为A添加含有两个参数的构造方法,对a和b初始化。 3)为B添加含有一个参数的构造方法,对c初始化。 4)完成主控方法,在主控方法中用B e1=new B 5)创建对象,把a、b、c分别初始化成3、4、5,最后输出它们的和。 三、简答题

成员函数中访问对象的私有成员问题

问题(知识点)描述: a.在C++的类的成员函数中,允许直接访问该类的对象的私有成员变量。 b.在类的成员函数中可以访问同类型实例的私有变量。 c.拷贝构造函数里,可以直接访问另外一个同类对象(引用)的私有成员。 d.类的成员函数可以直接访问作为其参数的同类型对象的私有成员。 举例描述上述知识: 1).在拷贝构造函数中可以访问引用对象的私有变量:例如: class Point { public: Point(int xx=0,int yy=0){X=xx;Y=yy;} Point(Point &p); private: int X,Y; }; Point::Point (Point &p) { X=p.X; Y=p.Y; } 2).在类的成员函数中可以访问同类型实例的私有变量 class A { public: int getA() const { return a; } void setA(int val) { a = val; } void assign(A& _AA) { this->a = _AA.a; _ AA.a = 10; //可以直接访问 } void display() { cout<<"a:"< using namespace std; class TestClass { public: TestClass(int amount) { this->_amount = amount; } void UsePrivateMember() { cout<<"amount:"<_amount<

(完整版)C++复习题

复习题 一、选择填空 1.在下列关键字中,用来说明类中公有成员的是( )。 A. Public B. Private C. protected D. friend 答:A。 2.下列的各种函数中,( )不是类的成员函数。 A.构造函数 B.析构函数 C.友元函数 D.拷贝初始化构造函数答:C。 3.作用域运算符的功能是( )。 A.标识作用域的级别的 B.指出作用域的范围的 C.给定作用域的大小的 D.标识某个成员是属于哪个类的 答:D。 4.( )是不可以作为该类的成员的。 A.自身类对象的指针 B.自身类的对象 C.自身类对象的引用 D.另一个类的对象 答:B。 5.( )不是构造函数的特征。 A.构造函数的函数名与类名相同 B.构造函数可以重载 C.构造函数可以设置默认参数 D.构造函数必须指定类型说明 答:D。 6.( )是析构函数的特征。 A.一个类中只能定义一个析构函数 B.析构函数名与类名不同 C.析构函数的定义只能在类体内 D.析构函数可以有一个或多个参数 答:A。 7.通常的拷贝初始化构造函数的参数是( )。 A.某个对象名 B.某个对象的成员名 C.某个对象的引用名 D.某个对象的指针名 答:C。 8.关于成员函数特征的下述描述中,( )是错误的。 A.成员函数一定是内联函数 B.成员函数可以重载 C.成员函数可以设置参数的默认值 D.成员函数可以是静态的

答:A。 9.下述静态数据成员的特性中,( )是错误的。 A.说明静态数据成员时前边要加修饰符static B.静态数据成员要在类体外进行初始化 c.引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算 符 D.静态数据成员不是所有对象所共用的 答:D。 l0.友元的作用( )。 A.提高程序的运用效率 B.加强类的封装性 C.实现数据的隐藏性 D.增加成员函数的种类 答:A。 11.下列关于对象数组的描述中,( )是错误的。 A.对象数组的下标是从0开始的 B.对象数组的数组名是一个常量指针 C.对象数组的每个元素是同一个类的对象 D.对象数组只能赋初值,而不能被赋值 答案:D。 12.下列定义中,( )是定义指向数组的指针P。 A. int*p[5]; B. int(*p)[5]; C. (int *)p[5] D. int*p[]; 答案:B。 13.下列说明中 Const char * Ptr; ptr应该是( )。 A.指向字符常量的指针 B.指向字符的常量指针 C.指向字符串常量的指针 D.指向字符串的常量指针 答案:C。 14.已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中是正确的。 A. void print()const ; B. const void Print( ); C. void const print( ); D. void print (const); 答案:A。 15.关于new运算符的下列描述中,( )是错的。 A.它可以用来动态创建对象和对象数组 B.使用它创建的对象或对象数组,可以使用运算符delete删除

java数组初始化详解

一维数组 1) int[] a; //声明,没有初始化 2) int[] a=new int[5]; //初始化为默认值,int型为0 3) int[] a={1,2,3,4,5}; //初始化为给定值 4) int[] a=new int[]{1,2,3,4,5}; //同(3) int[] a=new int[5]{1,2,3,4,5}; //错误,如果提供了数组初始化操作,则不能定义维表达式 5) int[] a; a=new int[5]; //正确,同(2)一样 int[] a; a={1,2,3,4,5}; //错误,数组常量只能在初始化操作中使用,如(3) 6) int a[]; a[0]=1; //错误,因为数组没有初始化,不能赋值 a[1]=2; 二维数组 1) int[][] a; //声明,没有初始化 2) int[][] a=new int[2][3]; //初始化为默认值,int型为0 3) int[][] a={{1,2},{2,3},{3,4}}; //初始化为给定值 int[][] a={{1,2},{2,3},{3,4,5}}; //没有错,数组空间不是连续分配的,所以不要求每一维的大小相同 4) int[][] a=new int[2][]; a[0]=new int[3]; //a[0]其实就是一个数组 a[1]=new int[4]; //每一维的大小可以不一样; 5) int[][] a=new int[][]{{1,2},{2,3},{3,4,5}}; //同(3)

int[] a=new int[5]{{1,2},{2,3},{3,4,5}}; //错误,如果提供了数组初始化操作,则不能定义维表达式 int[][] a=new int[2][]; a[0]={1,2,3,4,5}; //错误,数组常量只能在初始化操作中使用 6) int[][] a=new int[2][]; a[0][1]=1; //错误,第二维没有初始化,不能赋值,https://www.wendangku.net/doc/ca7840587.html,ng.NullPointerExceptio n异常 总结: 1.二维就是数组的数组,里面的数组大小不要求一样 2.不管一维还是二维,在使用前(赋值,访问)必须初始化,可以用new默认初始化,也可以用数组常量初始化 1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行; 2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值; 3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。 实例: TestD.java(动态) 程序代码 public class TestD { public static void main(String args[]) { int a[] ; a = new int[3] ; a[0] = 0 ; a[1] = 1 ; a[2] = 2 ; Date days[] ;

java成员变量和方法的public等访问限定符的访问权限

在学习java的过程中,我写类经常会用到public,private 和protected 的,我的基本经验就是一般类的成员变量都是用private,方法用public,类内部用的方法用protected,如果是存在子类的,那我就会把父类中的成员变量变为protected。(其余的看具体实际情况而定) 不过在一些公司的笔试题中,他们会要求你具体的写出像public这些访问限定符的作用域。其实,平常我都没去系统的考虑这些访问限定符的作用域,特别是包内包外的情况,OK,笔试不行了。 这是java基本的知识,也是公司看重的,那没办法啦,我的脑袋记不住东西,那我只能把这些东西写下来方便自己温故知新。 貌似默认(无)是friendly 如果你看到这里还不是很了解上面的表,或者是很久就没看书了,忘记了上面的表的内容的意义,那下面的例子就是帮助你温故知新的好东东。 例如,有一个包demo中的类P,它有一个private 成员变量data,一个public 默认构造方法,一个public 访问方法getData(),一个protected修改方法setData(),还有一个默认访问方式的辅助方法print()。 package demo; public class P{ private int data; public P(){ setData(0); } public int getData(){ return data;

} protected void setData(int v){ data = v; } void print(){ System.out.println("used!") } } 本类的不用说了,在本类里面才不管什么访问限定符呢。 如有类Q,扩展了P,所以可以调用P的默认构造方法、访问方法getData()和修改方法 setData()。但类Q不能直接访问P的成员变量data,辅助方法print()也不行(可以把默认,也就是没加任何访问限定符,理解为"包访问 ",在子类中不能直接访问,但在同包中的类却可以访问)。 import demo.P public class Q extends P{ public Q(){ super(); <---------------------------Q可以访问父类的默认构造方法 } public Q(int v){ setData(v); <------------------------Q可以访问父类的protected的方法 } public String toString(){ int v = getData(); <--------------------Q 可以访问父类的public的方法

C++类构造函数初始化列表

C++类构造函数初始化列表 初始化列表的定义 在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种:一种是构造函数内对类的成员赋值,一种则是使用初始化列表的构造函数显式的初始化类的成员。 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() { a=0; b=8.8; } }; 从技术上说,用初始化列表来初始化类成员比较好,但是在大多数情况下,两者实际上没有什么区别。第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑

初始化列表的必要性 初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。但在一些情况下,初始化列表可以做到构造函数做不到的事情: 1、类里面有const类型的成员,它是不能被赋值的,所以需要在初始化列表里面初始化它; 2、引用类型的成员(也就是名字成员,它作为一个现有名字的别名),也是需要在初始化列表里面初始化的,目的是为了生成了一个其名字成员在类外可以被修改而在内部是只读的对象; 3、需要调用基类的构造函数,且此基类构造函数是有参数的; 4、类里面有其他类类型的成员,且这个“其他类”的构造函数是有参数的。 举个例子:设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。 classCExampleOld { public: CExampleOld(int x) { ... } }; 因为CExampleOld有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建CExampleOld的一个实例。 CExampleOld* pEO = new CExampleOld; // 出错!! CExampleOld* pEO = new CExampleOld(2); // OK 如果CExampleOld是另一个类的成员,你怎样初始化它呢?答案是你必须使用成员初始化列表。class CExampleNew { CExampleOldm_EO; public: CExampleNew(); }; // 必须使用初始化列表来初始化成员m_EO //CExampleNew::CExampleNew() : m_EO(2) {……} 没有其它办法将参数传递给m_EO。 情况3和4其实一样的道理。如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。

Java数组一定要初始化才能使用吗

Java数组一定要初始化才能使用吗? 数组是大多数编程语言提供的一种复合结构,如果程序需要多个类型相同的变量时,就可以考虑定义一个数组。Java语言的数组变量是引用类型的变量,因此具有Java独有的特性。在正常的Java开发中,使用Java数组之前,我们都会对数组进行初始化,为数组中的元素分配内存空间、赋值等,但Java数组一定要初始化吗?不初始化可以么? 其实,java的数组变量是引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使用该数组变量,比如下面这个例子: public class T { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //定义并初始化nums数组 int nums[] = new int[]{3,13,4,6}; //定义一个prices数组变量 int prices[]; //让prices数组指向nums所引用的数组 prices = nums; for(int i=0;i

} } 从上面代码可以看出,定义了prices数组之后,并未对prices数组进行初始化。当执行int prices[]之后, 程序的内存分配如图 从图可以看出,此时的prices数组还未指向任何有效的内存,未指向任何数组对象,此时的程序还不可使用prices数组变量。 当程序执行prices = nums之后,prices变量将指向nums变量所引用的数组,此时prices变量和nums变量引用同一个数组对象。 执行这条语句之后,prices变量已经指向有效的内存及一个长度为4的数组对象,因此程序完全可以正常使用prices变量了。 对于数组变量来说,它并不需要进行所谓的初始化,只要让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。 所以,Java语言中的数组,不一定要初始化也可正常使用。Java初学者可以尝试用上面这里例子的方法,实际操作一下,加深印象。最后,希望小编的分享对大家有帮助。 【编辑推荐】 探究Java初始化的过程 Java类变量和成员变量初始化过程 Java类与对象的初始化 继承关系的类初始化和实例化的顺序 如何在https://www.wendangku.net/doc/ca7840587.html,应用程序中初始化 9个Java初始化和回收的面试题

软件开发一系列按照特定顺序组织的计算机数据和指令的集

软件开发:一系列按照特定顺序组织的计算机数据和指令的集合。 系统:DOS、windows Linux 应用软件:扫雷、QQ 实现了人与计算机间更好的交互 交互方式:图形化界面、命令行方式 Dos常见的命令行: SUN(Stanford University Network)斯坦福大学网络公司 JEE企业版(Servlet JSP等)是开发企业环境下的应用程序提供的一套解决方案,主要针对WEb应用程序开发 JSE标准版是为开发普通桌面和商务应用程序 JME小型版开发电子产品和嵌入式设备 跨平台性:通过JA V A语言编写的应用程序在不同的系统平台上都可以应用 原理:在要运行的java应用程序的操作系统上,先安装一个java虚拟机(jvm java virtual machine)有JVM来负责JA V A程序在该系统中的运行。 JA V A语言的环境搭建: JRE:RUNTIME ENVIRONMENT java运行环境和java程序所需的核心类库等 JDK:java开发工具包(DEVELOPMENT KIT)提供java开发人员使用的,包含了java的开发工具包,也包含了JRE (javac 编译工具)(jar 打包工具) 电脑、属性、高级、环境变量、Path:将要执行的Javac路径放置在或者说告诉windows。Path=D:\Java\jdk1.6.0_21\bin; haha不好听没有意义:改为JA V A_HOME Haha=D:\Java\jdk1.6.0_21; Path=%Haha%\bin; 临时配置方式:set可以查看或者配置环境变量 Dos只在当前窗口有效。Set path =D:\Java\jdk1.6.0_21\bin;就可以了 在path的基础上再加上新的目录,Set path =D:\Java\jdk1.6.0_21\bin;%Path% start开一个新窗口,沿袭前者的配置。 Hello world :public class Demo,此时类名必须和源文件名称相同,比如123.java、Demo.class,若此时的Demo为Public时源文件必须为Demo.java Set classpath= ;此时什么都没有写的话,就是对环境变量的清空。告诉java去哪找需要加载的类文件。 问题:环境变量path和classpath的作用是什么? 答:.PA TH变量用于列出可执行文件的搜索路径.因为要通过命令行的命令启JA V A,JA V AC等编译工具和解释工具,系统必须要知道他们所在位置,而PA TH则指明了其位置. CLASSPATH变量用于JA V A加载类的路径.只有在classpath设置的路径中的类才能被加载. 注释:******************虚拟机在启动的时候先找的是环境变量classpath **************

相关文档
相关文档 最新文档