C++第14章 常量成员静态成员与友元

合集下载

C++ 类

C++ 类

4 读写函数与功能函数
功能函数不属于类的public接口,而是private成员函数, 支持类的public成员函数的操作。 读写函数用于读取或设置类的数据成员,它包括get函数 和set函数。get函数可以控制成员变量值的格式和显示。 set函数可以验证用户对成员变量的设置操作,从而确保 新值对成员变量是合适的。
2 构造函数
如果没有显式地为一个类提供一个拷贝构造函数,则 C++将会为该类提供一个默认的拷贝构造函数。默认拷 贝构造函数将逐个地完成类成员的拷贝,如果成员是 另一个类的对象,则将调用该类的拷贝构造函数或默 认拷贝构造函数。
3 析构函数
析构函数用于释放构造函数所分配资源,以供其他实例 使用。 类的析构函数名由类名称和逻辑非运算符(~)组成, 表示“逆构造函数”。 删除对象时会调用类的析构函数,即程序执行离开初始 化类对象的作用域时对类对象执行的自动操作。 构造函数不接收参数也不返回数值。类只能有一个析构 函数,而且析构函数不允许重载。每个类都有一个析构 函数。如果程序员没有显式提供析构函数,那么编译器 就会隐式地生成一个析构函数。
5 const类成员 类成员
使用关键字const声明的对象称为常量对象,而使用关键 字const声明的成员函数称为常量函数。 任何试图修改这种对象的操作都会产生语法错误。如果 将一个对象声明为常量对象,则该对象就不能调用类中 任何非常量型的成员函数(编译器隐式调用的构造函数 和析构函数出外)。 使用const声明的函数既不能修改对象的数据成员,也 不能调用同一类实例的非常量成员函数,否则,都将产 生编译错误。
6 友元
通过使用friend关键字来使一个函数或类成为另一个类 的友元函数或友元类。友元函数和友元类都有权访问类 的非public成员。 友元关系是人为指定的,而不是获取的。例如,如果要 让类B成为类A的友元,类A必须显式声明类B为自己的 友元。此外,友元关系既不对称也不能传递。例如,如 果类A是类B的友元,类B是类C的友元,并不能认为类 B是类A的友元(不对称),类C是类B的友元或类A是 类C的友元(不传递)。

c 关键字大全

c 关键字大全

C++关键字大全1. asm(汇编),用法如下:asm (指令字符串); 允许在C++程序中嵌入汇编代码。

2. auto(自动,automatic)是存储类型标识符,表明变量“自动”具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。

3. bool(布尔)类型,C++中的基本数据结构,其值可选为true(真)或者false(假)。

C++中的bool类型可以和int混用,具体来说就是0代表false,非0代表true。

bool类型常用于条件判断和函数返回值。

4. break(中断、跳出),用在switch语句或者循环语句中。

程序遇到break后,即跳过该程序段,继续后面的语句执行。

5. case用于switch语句中,用于判断不同的条件类型。

6. catch catch和try语句一起用于异常处理。

7. char char(字符,character)类型,C++中的基本数据结构,其值一般为0~255的int。

这256个字符对应着256个ASCII码。

char类型的数据需要用单引号’’括起来。

8. class class(类)是C++面向对象设计的基础。

使用class关键字声明一个类。

9. const const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。

在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。

在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量10. const_cast 用法:const_cast<type_id> (expression) 该运算符用来修改类型的const或volatile属性。

C++考试题库及答案

C++考试题库及答案

判断char型变量cl是否为小写字母的正确表达式是________。

(2.0分)A、(cl>='a')&&(cl<='z')B、('a'>=cl)||('z'<=cl)C、a'<=cl<='z'D、(cl>=a)&&(cl<=z)假定MyClass为一个类,则执行"MyClass a(2),b[5],*c[4]"后,执行构造函数的次数为________。

(2.0分)A、6B、11C、10D、5char *s1="hello",*s2;s2=s1;则________。

(2.0分)A、s1不能再指向其它单元B、cout<<s1;与cout<<s2;结果相同C、不能访问"hello"D、s2指向不确定的内存单元已知:p是一个指向类A数据成员m的指针,A1是类A的一个对象。

如果要给m赋值为5,正确的是________。

(2.0分)A、*A1.p=5;B、A1.*p=5;C、A1->p=5;D、A1.p=5;C++异常处理机制中没有________。

(2.0分)A、finallyB、tryC、throwD、catch所谓多态性是指________。

(2.0分)A、一个对象调用不同名称的对象B、一个对象调用不同名称的函数C、不同的对象调用相同名称的函数D、不同的对象调用不同名称的函数关于new运算符的下列描述中,________是错的。

(2.0分)A、使用它创建对象数组时必须指定初始值B、它可以用来动态创建对象和对象数组C、使用它创建对象时要调用构造函数D、使用它创建的对象和对象数组可以使用运算符delete删除以下正确的说法是:在C++语言中进行值传递时________。

C#中静态方法与非静态方法(static),公有与私有(public,private)

C#中静态方法与非静态方法(static),公有与私有(public,private)

C#中静态⽅法与⾮静态⽅法(static),公有与私有(public,private)梳理公有与私有,静态与⾮静态的应⽤1)公有与私有public(公有的):声明的⽅法和属性,可以被外部调⽤.private(私有的):声明的⽅法和属性,只能在本类中被调⽤,外部看不到.2)静态与⾮静态static(静态的):声明的⽅法和属性,不需要实例化就能被调⽤(公有/私有).C#静态⽅法与⾮静态⽅法⽐较⼀、C#静态成员:1、静态成员属于类所有,⾮静态成员属于类的实例所有。

2、每创建⼀个类的实例,都会在内存中为⾮静态成员新分配⼀块存储;⼆、C#静态⽅法1、C#静态⽅法属于类所有,类实例化前即可使⽤。

2、⾮静态⽅法可以访问类中的任何成员,静态⽅法只能访问类中的静态成员。

3、因为静态⽅法在类实例化前就可以使⽤,⽽类中的⾮静态变量必须在实例化之后才能分配内存,C#静态⽅法调⽤时⽆法判断⾮静态变量使⽤的内存地址。

所以⽆法使⽤。

⽽静态变量的地址对类来说是固定的,故可以使⽤。

三、C#静态⽅法是⼀种特殊的成员⽅法它不属于类的某⼀个具体的实例,⽽是属于类本⾝。

所以对静态⽅法不需要⾸先创建⼀个类的实例,⽽是采⽤类名.静态⽅法的格式。

1.static⽅法是类中的⼀个成员⽅法,属于整个类,即不⽤创建任何对象也可以直接调⽤!static内部只能出现static变量和其他static⽅法!⽽且static⽅法中还不能使⽤this…等关键字…因为它是属于整个类!2.静态⽅法效率上要⽐实例化⾼,静态⽅法的缺点是不⾃动进⾏销毁,⽽实例化的则可以做销毁。

3.静态⽅法和静态变量创建后始终使⽤同⼀块内存,⽽使⽤实例的⽅式会创建多个内存.4.C#中的⽅法有两种:实例⽅法,静态⽅法.静态⽅法销毁:主进程销毁时,内存中分配的静态⽅法销毁.四、获取类的名称C#静态⽅法中获取类的名称静态⽅法中⽤:string className = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;⾮静态⽅法中还可以⽤:string className = this.GetType().FullName;。

C++类静态成员与类静态成员函数详解

C++类静态成员与类静态成员函数详解

C++类静态成员与类静态成员函数详解当将类的某个数据成员声明为static时,该静态数据成员只能被定义⼀次,⽽且要被同类的所有对象共享。

各个对象都拥有类中每⼀个普通数据成员的副本,但静态数据成员只有⼀个实例存在,与定义了多少类对象⽆关。

静态⽅法就是与该类相关的,是类的⼀种⾏为,⽽不是与该类的实例对象相关。

静态数据成员的⽤途之⼀是统计有多少个对象实际存在。

静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。

也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建⼀个类的对象则静态数据成员都要被重新初始化。

静态成员不可在类体内进⾏赋值,因为它是被所有该类的对象所共享的。

你在⼀个对象⾥给它赋值,其他对象⾥的该成员也会发⽣变化。

为了避免混乱,所以不可在类体内进⾏赋值。

数据类型类名::静态数据成员名=初值不能⽤参数初始化表对静态成员初始化。

⼀般系统缺省初始为0。

静态成员是类所有的对象的共享的成员,⽽不是某个对象的成员。

它在对象中不占⽤存储空间,这个属性为整个类所共有,不属于任何⼀个具体对象。

所以静态成员不能在类的内部初始化,⽐如声明⼀个学⽣类,其中⼀个成员为学⽣总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。

复制代码代码如下:#include "iostream"using namespace std;class test{private:int x;int y;public:static int num;static int Getnum(){x+=5; // 这⾏代码是错误的,静态成员函数不能调⽤⾮静态数据成员,要通过类的对象来调⽤。

num+=15;return num;}};int test::num = 10;int main(void){test a;cout<<test::num<<endl; //10test::num = 20;cout<<test::num<<endl; //20cout<<test::Getnum()<<endl; //35cout<<a.Getnum()<<endl; //50system("pause");return 0;}通过上例可知: x+=5; // 这⾏代码是错误的静态函数成员必须通过对象名来访问⾮静态数据成员。

C++类中的静态成员变量和静态成员函数的作用

C++类中的静态成员变量和静态成员函数的作用

数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数..分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。

一、在面向过程设计中的static关键字1、静态全局变量定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。

特点:A、该变量在全局数据区分配内存。

B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。

C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。

例〔摘于C++程序设计教程---钱能主编P103〕://file1.cpp//Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){n=20;cout < <n < <endl;fn();}void fn(){n++;cout < <n < <endl;}D、文件作用域下声明的const的常量默认为static存储类型。

静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。

对于一个完整的程序,在内存中的分布情况如以下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。

C++友元函数和友元类(C++friend)详解

C++友元函数和友元类(C++friend)详解

C++友元函数和友元类(C++friend)详解私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接⼝(成员函数)间接地进⾏。

这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的⿇烦。

是从结构化的C语⾔发展⽽来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。

C++ 设计者认为,如果有的程序员真的⾮常怕⿇烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做⼀点妥协以满⾜他们的愿望为好,这也算是眼前利益和长远利益的折中。

因此,C++ 就有了友元(friend)的概念。

打个⽐⽅,这相当于是说:朋友是值得信任的,所以可以对他们公开⼀些⾃⼰的隐私。

友元分为两种:友元函数和友元类。

友元函数在定义⼀个类的时候,可以把⼀些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。

将全局函数声明为友元的写法如下:friend 返回值类型函数名(参数表);将其他类的成员函数声明为友元的写法如下:friend 返回值类型其他类的类名::成员函数名(参数表);但是,不能把其他类的私有成员函数声明为友元。

关于友元,看下⾯的程序⽰例。

1. #include<iostream>2. ug namespace std;3. class CCar; //提前声明CCar类,以便后⾯的CDriver类使⽤4. class CDriver5. {6. public:7. void ModifyCar(CCar* pCar); //改装汽车8. };9. class CCar10. {11. private:12. int price;13. friend int MostExpensiveCar(CCar cars[], int total); //声明友元14. friend void CDriver::ModifyCar(CCar* pCar); //声明友元15. };16. void CDriver::ModifyCar(CCar* pCar)17. {18. pCar->price += 1000; //汽车改装后价值增加19. }20. int MostExpensiveCar(CCar cars[], int total) //求最贵⽓车的价格21. {22. int tmpMax = -1;23. for (int i = 0; i<total; ++i)24. if (cars[i].price > tmpMax)25. tmpMax = cars[i].price;26. return tmpMax;27. }28. int main()29. {30. return 0;31. }这个程序只是为了展⽰友元的⽤法,所以 main 函数什么也不做。

常量函数知识点归纳总结

常量函数知识点归纳总结

常量函数知识点归纳总结常量函数是一种特殊的函数,它具有一些独特的特性和用途。

在编程中,了解常量函数的特点和用法对于设计和编写高质量的代码非常重要。

本文将对常量函数的定义、特点、用法以及相关注意事项进行归纳总结。

一、常量函数的定义常量函数是指在函数声明和定义中加上const关键字的函数。

在C++中,常量函数的声明和定义分别如下所示:```cpp// 声明常量函数void fun() const;// 定义常量函数void ClassName::fun() const {// 函数体}```在函数声明和定义的参数列表后加上const关键字即可将函数声明为常量函数。

这使得函数在被调用时无法修改成员变量的值,从而实现了常量函数的特性。

二、常量函数的特点常量函数具有以下几个特点:1. 不能修改成员变量:在常量函数中,不允许修改任何类的成员变量。

即使类的成员变量被声明为可变的(mutable),常量函数也不能修改它们的值。

2. 只能调用其他常量函数:常量函数只能调用其他常量函数,因为非常量函数有可能修改成员变量的值,这与常量函数的特性相悖。

3. 适用于常量对象:常量函数通常用于处理常量对象,因为常量对象的成员变量不能被修改。

通过使用常量函数,可以确保对常量对象的操作不会改变对象的状态。

4. 不产生副作用:由于常量函数不能修改成员变量的值,它不会产生副作用。

这使得常量函数更加安全和可靠,有利于编写健壮的代码。

5. 表现为类的不变性:常量函数可以用来表现类的不变性(invariant),即类在某一时间段内不会发生变化的特性。

通过在常量函数中实现不变性,可以确保对象的状态不会被错误地修改。

三、常量函数的用法常量函数在实际编程中具有多种用途,主要包括以下几个方面:1. 处理常量对象:常量函数通常用于处理常量对象,以确保对象的状态不会被修改。

这对于编写高质量的代码非常重要,可以避免在对象被错误地修改时引发不确定的行为。

面向对象程序设计-类和对象_V2

面向对象程序设计-类和对象_V2
};
2 析构函数(续)
析构函数的说明 1)类只有一个,若未显式定义,编译系统 自动生成默认的析构函数。 2)系统会自动调用析构函数,在 (1)对象生存期结束时(}结束); (2)使用delete释放对象时。
3 重载构造函数
与一般成员函数一样,C++运行重载构造 函数,重载的方法一样。
class A{
2 成员函数的定义(续)
2)类内直接定义;
class student { int age;
public: void SetAge(int a){ age = a;} };
这样定义的成员函数是一种内置函数,亦 可在类外定义内置函数,不过要在函数前 加上“inline”。
2 成员函数的定义(续)
说明: 1)类外定义时,成员函数前应缀上类名。
1 构造函数(续)
构造函数的定义 class complex{ double real; double imag; public: // 下面为构造函数 complex(double r,double i) { real=r; imag=i; } double realcomplex() { return real;} };
};
1 构造函数(续)
带参数的构造函数的使用
#include <iostream.h>
void main() {
complex S1;
//使用两个缺省参数
complex S2(1.1); //使用一个缺省参数
complex S3 (1.1,2.2);
cout<<“real of A is”<<\
1 构造函数(续)
构造函数的使用说明: 1)必须和类同名,否则当作一般成员函数 2)必须无返回类型,void类型也不行 3)如果程序员未定义构造函数,编译器自 动生成一个默认的构造函数 如: complex::complex( ) { } 4)构造函数可以不带参数

C++题目11-12

C++题目11-12

HZAU-专业C++作业11-12判断题1. 友元关系是单向的,不可交换的。

(2分)2. 只有成员函数才能传递this指针,而友元函数不能传递this指针(2分)3. 友元函数是成员函数,它可以访问类中私有成员。

(2分)4. 在成员函数中访问对象的数据成员时,可以直接用数据成员名,而在友员函数中访问对象的数据成员时,必须指明是哪个对象的数据成员。

(2分)5. 友元是可以继承的。

(2分)6. 常成员函数只能用来引用数据成员的值,而不允许改变数据成员的值。

(2分)7. C++语言允许使用友元,但是友元会破环封装性。

(2分)8. 必须在类定义体外对静态数据成员进行初始化。

(2分)9. 能访问一个类CMyClass中的private成员的可以是类CMyClass 的成员函数,友元函数和友元类中的函数。

(2分)10. 类的友元函数是指可以访问本类私有成员的其他类的成员函数。

(2分)11. 类中的静态成员数据为该类的所有对象所共享,并且,在该类对象被撤销时,静态成员并没有撤销。

(2分)12. 如果在一个类的对象之间要进行数据交换,可以使用该类的静态数据成员来完成。

(2分)13. 如果一个类的所有对象都共享某一个变量,则应当将该变量定义为该类的私有成员。

(2分)1.如果类A被说明成类B的友元,则()。

(2分)A. 类A的成员即类B的成员B. 类B的成员即类A的成员C. 类A的成员函数不得访问类B的成员D. 类B不一定是类A的友元2.友元的作用()。

(2分)A. 提高程序的运用效率B. 加强类的封装性C. 实现数据的隐藏性D. 增加成员函数的种类3.下述静态数据成员的特征中,()是错误的。

(2分)A. 静态数据成员要在类体外进行初始化B. 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符C. 静态数据成员不是所有对象所共用的D. 说明静态数据成员时前边要加修饰符static已知类A是类B的友元,类B是类C的友元,则()。

C++类中的各种成员,嵌套类,友元,this指针专题

C++类中的各种成员,嵌套类,友元,this指针专题

类中的各种成员
const ,static,[],*p,const static,对象成员,常量对象,mutable 1.类中的静态成员变量 static:被类中的所有对象所共享,静态成员属于整个类不属于某个对象。静态成员变量和全局 变量差不多,只是他的作用范围为定义他的类及类的对象所知。 1.1.当在一个类中声明静态成员变量时并没有定义该变量即没有为他分配存储空间,所以必须在类外对静态成员变 量提供全局定义,注意必须在类外,这样就可以为变量分配内存,定义的方式为使用作用域解析符,比如有类 hyong 类中有静态整型成员 a,那么在类外定义该变量的方式为 int hyong::a=9;注意必须要有在类中声明的类型, 如果定义时没有初始化则自动初始化为 0。 1.2.静态成员变量如果是类中的公有成员则可以在程序中使用语句 hyong::a 来访问该变量,当然也可以通过对象名 来访问该变量,如果变量是私有或者保护的,则只能用静态的成员函数来访问该变量。 1.3 不能用初始化列表来初始化静态成员变量。 2.静态成员函数 static,静态成员函数没有 this 指针,静态成员函数只能引用这个类的其他类静态成员,当然全局函数 和数据可以访问,因为类的函数都要用 this 指针来访问成员,因为静态成员函数没有 this 指针,所以不能访问除静态 成员之外的成员。同一个函数不可以有静态和非静态两种版本,静态成员函数不可以是虚函数,静态成员函数不能是 const 和 volatile。静态成员函数使用是有限的,通常使用静态成员函数来访问类中的私有静态成员变量。在类外定义 的形式为 int hyong::g(){}注意,这里没有 static 说明符。 3.const 成员变量参看第四节初始化列表。 4.const 成员函数,形式为 int f() const{}注意 const 在括号后,如果把 const 放在 int 前就成为一个反回 const int 类型的函 数了, 把函数声明为 const 后就使得 this 可以当做一个 const 指针, 从而使得函数不能修改调用它的对象也就是说不能 改变任何一个类的成员变量的值。如果想让 const 函数能修改某一部分成员,可以把该成员声明为 mutable 类型,例 如 mutable int a。在类外定义的形式为 int hyong::f() const{} 5.const static 常量静态数据成员,这种类型的成员变量可以直接在类的定义中直接初始化,这也是唯一一种可以在类 中初始化的类型,如果没有在类中初始化,在类外的初始化方式为 const int hyong::a=2;注意 const 和类型都必须有。 6.const 常量对象:即把对象声明为常量,即 const hyong m,常量对象不能调用可能改变对象的值的函数,因此常量对 象只能调用类中的 const 常量函数,因为不是 const 的函数都有可能改变对象的值。 6.2.常量对象可以调用类中的公有成员,如 m.a 就是正确的如果 a 是公有的。 6.4.不能对常量对象的公有成员重新赋值,如 m.a=3 就是错误的。但可以对类中的公有静态成员变量重新赋值,因 为静态成员变是不属于这个常量对象,他是属于整个类的。 7.对象数组:对象数组即数组中的每个成员都是一个对象,例如 hyong a[3];其中 a[0],a[1],a[2]都是一个 hyong 类型的 对象。对象数组的初始化,如果有默认构造函数则语句 hyong a[3]将调用默认构造函数初始化 3 个对象,如果对象数

C#基础知识点

C#基础知识点

款计算,而不必查找整个程序,修改税率为
0.06 的每个项。
● 常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常 量已经有了一个值,编译器就会报告错误。
是 C#的一个重要特性, object 类型就可以用于两个目的:
● 可以使用 object 引用绑定任何特定子类型的对象。
● object 类型执行许多基本的一般用途的方法, 包括 Equals()、GetHashCode() 、GetType()
和 ToString() 。用户定义的类可能需要使用一种面向对象技术——
变量存在于表示声明该变量的块语句或方法结束的封闭花括号之前的作用域内。
● 在 for、 while 或类似语句中声明的局部变量存在于该循环体内。
局部变量的作用域冲突
大型程序在不同部分为不同的变量使用相同的变量名是很常见的。
只要变量的作用域是程序
的不同部分,就不会有问题,也不会产生模糊性。 但要注意, 同名的局部变量不能在同一作
隐式转换一般不
2.显式转换
显式类型转换,就是强制类型转换。与隐式转换正好相反,显式转换需要用户明确 指定转换的类型,不如看下面例子:
long l = 5000; int I = (int)l; 显式转换可以发生在表达式的计算过程中。 信息丢失。显式转换包括所有的隐式转换。 显式转换包括下面几种:
它并不是总能成功, 而且常常可能引起
而是内置于 .NET Framework 中。例如, .NET 结构 System.Int32 的一个实例。
说明
Object
System.Object
根类型,其他类型都是从它派生而来的 ( 包括值类型 )
String

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解

C++运算符重载三种形式(成员函数,友元函数,普通函数)详解三种重载⽅式⾸先,介绍三种重载⽅式:1//作为成员函数重载(常见)2class Person{3 Private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8bool operator<(const Person& b);910 };11bool Person::operator<(const Person& b)12 {13//作为成员函数时,*this即为左操作数a14 ...15 }1//作为友元函数重载2class Person{3private:4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}8 friend bool operator<(const Person& a,const Person& b);910 };11bool operator<(const Person& a,const Person& b)12 {13 ...14 }1//作为普通函数重载(不推荐)2class Person{3public://注意,重载运算符为普通函数时,使⽤到的类成员必须为public4string name;5int age;6public:7 Person(const char* name, int age):name(name),age(age){}89 };10bool operator<(const Person& a,const Person& b)11 {12 ...13 }作为成员函数重载先介绍第⼀种:bool Person::operator<(const Person& b),bool是函数返回类型,Person::只是指定了成员函数所属类名。

C++知识点总结

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课后习题解答

c课后习题解答

第6章;类和对象(一)练习题66.1判断题×1.使用class定义的类,其默认的访问权限是公有的,使用struct定义的类,其默认的访问权限是私有的。

×2.类中的成员函数都是公有的,数据成员都是私有的。

×3.定义在类体内的成员函数是内联函数,定义在类体外的成员函数不能是内联函数。

√4.类定义后,它的成员个数及名称就不会再被改变了。

×5.定义或说明对象时,系统会自动调用构造函数为创建的对象初始化。

如果类中没有定义任何构造函数时,就无法给定义的对象初始化。

√6.定义一个对象时,系统只为该对象的数据成员开辟内存空间,而成员函数是同类对象共享的。

√7.对象成员的表示方法与结构变量成员的表示方法相同。

√8.创建对象时系统自动调用相应的构造函数为对象初始化,没有相应的构造函数时,系统会自动生成。

√9.构造函数是一个其名与类名相同的特殊的成员函数。

×10.析构函数是一个函数体为空的成员函数。

√11.构造函数和析构函数都是系统自动调用的成员函数。

×12.构造函数和析构函数都可以重载。

√13.成员函数与一般函数一样可以重载、内联和设置参数的默认值。

×14.静态成员是指静态对象的成员。

×15.静态数据成员必须在构造函数的成员初始化列表中进行初始化。

√16.静态成员都可以使用类名加作用域运算符的方法来引用。

×17.静态成员函数中引用静态数据成员和非静态数据成员的方式是相同的。

√18.常成员指的是类体内使用const关键字说明的常数据成员和常成员函数。

×19.常数据成员在常成员函数中的值是不允许改变的,而在非常成员函数中是允许改变的。

√20.常对象需要引用常成员函数,而不能引用非常成员函数。

×21.常对象的数据成员都是常数据成员。

√22.友元函数是说明在类体内的非成员函数,它可以访问类中的所有成员。

×23.可以把一个一般函数说明为某类的友元函数,也可以将某类的成员函数说明为另类的友元函数。

第五章答案类、构造函数、拷贝构造函数、静态成员、友元

第五章答案类、构造函数、拷贝构造函数、静态成员、友元

5.3 练习题解答1.什么是类?为什么说类是一种抽象数据类型的实现?答:类是C++语言中的一种数据类型。

这种数据类型是一种封装体,它既包含有数据结构,又包含有对这些数据所进行的若干操作。

类的获得是通过对于所要解决的问题中的客观实体的抽象,这种抽象不仅包含了它的属性,同时还有对这些属性的操作,即方法。

对实体的这种抽象可用一个标识符来表示,并可对它引用及操作,这种标识符称为类。

可见,类是抽象数据类型的一种实现。

2.类的定义格式如何?类的说明部分和实现部分各包含些什么?答:类的定义格式包含说明部分和定义部分。

类的说明部分主要有类头和类体两部分。

类头定义格式如下所示。

class<类名>其中,class是关键字,<类名>同标识符。

类体是由一对花括号括起来的若干成员,成员中包含数据成员和成员函数,右花括号后边有一个分号。

{〈数据成员说明〉〈成员函数说明〉};成员又分为不同的访问权限,有公有(puLlic)、私有(private)和保护(protected)3种。

类的实现部分是用来定义类中说明的成员函数(没有定义)在该部分定义。

如果类中所有成员函数都已在类体内定义了,则实现部分可以省略。

3.类的成员一般分为哪两部分?这两部分有何区别?答:类的成员一般分为数据成员和成员函数两个部分。

前一部分是用来表示状态的数据,后一部分是用来改变状态的方法(即函数)。

简单地讲,前部分是变量,后部分是函数,后部分的函数是用来对前部分的变量进行操作的。

4.从访问权限角度如何区分不同种类的成员?它们各自的特点是什么?答:从访问权限角度可以将类中成员分为三种:公有的,私有的和保护的。

公有成员可以被类体内外的程序所访问,它通常作为一个类体的对外接口。

私有成员只能对类体内的程序所访问,在类体外是不可见的。

它是类中的被隐藏部分。

保护成员对一般类而言视同私有成员,对派生类同公有成员。

它可以被其派生类中的程序访问。

5.作用域运算符的功能是什么?它的使用格式如何?答:作用域运算符::是C十十语言中的一种运算符,用来指明某个标识符的作用域,主要用于标识类中成员。

c++笔记15静态成员和友元

c++笔记15静态成员和友元

静态成员的需要性静态成员的使用静态数据成员静态成员函数需要友元的原因友元的使用私有成员和保护成员提供了方便,但破坏了类的封装性和隐蔽性。

友元可以是一个函数,称为友元函数,也可以是一个类,称为友元类。

友元函数和友元类统称为友元。

一、静态成员的需要性类相当于一个数据类型,当说明一个某类的对象时,系统就为该对象分配一块内存单元来存放类中的所有成员。

但在某些应用中,需要程序中属于某个类的所有对象共享某个数据。

为此,一个解决的办法就是将所要共享的数据说明为全局变量,但这将破坏数据的封装性;较好的解决办法是将所要共享的数据说明为类的静态成员。

二、静态成员的使用C++中在说明类成员(数据成员和成员函数)时,使用了static关键字,则这类成员称为类的静态成员。

静态成员是所有对象公有的。

静态成员有静态数据成员和静态函数成员之分。

C++中,同一个类定义多个对象时,每个对象拥有各自的数据成员(不包括静态数据成员),而所有对象共享一份成员函数和一份静态数据成员。

静态数据成员是类的所有对象中共享的成员,而不是某个对象的成员,因此可以实现多个对象间的数据共享。

静态数据成员不属于任何对象,它不因对象的建立而产生,也不因对象的析构而删除,它是类定义的一部分, 所以使用静态数据成员不会破坏类的隐蔽性。

对静态数据成员的操作和一般数据成员一样,定义为私有的静态数据成员不能由外界访问。

静态数据成员可由任意访问权限许可的函数访问。

可以在类的成员函数中改变静态数据成员。

静态数据成员不从属于任何一个具体对象,所以必须对它初始化,且对静态数据成员的初始化不能在构造函数中进行。

类中用关键字static修饰的数据成员叫做静态数据成员。

说明一个静态数据成员的方法与说明一个一般静态变量一样,只不过前者是在一个类中说明。

静态数据成员的使用方法如下:1) 静态数据成员的定义与一般数据成员相似,但前面要加上static关键词。

2) 静态数据成员的初始化与一般数据成员不同,静态数据成员初始化的格式如下:<类型> <类名>::<静态数据成员>=<值>;int Student :: noOfStudents = 0;3)在引用静态数据成员时采用格式:<类名>::<静态数据成员>几点注意:⏹静态数据成员是类的一部分,静态数据成员的定义是类定义的一部分,将其放在类的内部实现部分中定义。

新《C++程序设计》自考必备题库(含答案)

新《C++程序设计》自考必备题库(含答案)

新《C++程序设计》自考必备题库(含答案)一、单选题1、类A将每其它类对象作为成员,则建立A类对象时,下列描述正确的是()A、A类构造函数先执行B、成员构造函数先执行C、两者并行执行D、不能确定正确答案:B2、列描述错误的是()A、在创建对象前,静态成员不存在B、静态成员是类的成员C、静态成员不能是虚函数D、静态成员函数不能直接访问非静态成员正确答案:A3、关多态性说法不正确的是()A、C++语言的多态性分为编译时的多态性和运行时的多态性B、编译时的多态性可通过函数重载实现C、运行时的多态性可通过模板和虚函数实现D、实现运行时多态性的机制称为动态多态性正确答案:C4、编译指令中,宏定义使用哪个指令()A、ttincludeB、#defineC、#ifD、#else正确答案:B5、于对象概念的描述中,说法错误的是()A、对象就是C语言中的结构体B、对象代表着正在创建的系统中的一个实体C、对象是类的一个变量D、对象之间的信息传递是通过消息进行的正确答案:A6、没有使用private关键字定义类的数据成员,则默认为()A、privateB、publicC、protectedD、friend正确答案:A7、符型数据在内存中的二进制编码方式是()A、补码B、原码C、ASCII码D、反码正确答案:C8、++语言是从早期的C语言逐渐发展演变而来的与C语言相比,它在求解问题方法上进行的最大改进是:()A、面向过程B、面向对象C、安全性D、复用性正确答案:B9、符串“ABC”在内存占用的字节数是()A、3B、4C、6D、8正确答案:B10、创建派生类对象时,构造函数的执行顺序是()A、对象成员构造函数、基类构造函数、派生类本身的构造函数B、派生类本身的构造函数、基类构造函数、对象成员构造函数C、基类构造函数、派生类本身的构造函数、对象成员构造函数D、基类构造函数、对象成员构造函数、派生类本身的构造函数正确答案:D11、中定义的成员默认访问属性为()A、publicB、privateC、protectedD、friend正确答案:B12、求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用()A、内联函数B、重载函数C、内部函数D、函数模板正确答案:A13、面正确的字符常量是()A、“c”B、'\\''C、,W<D、''正确答案:C14、有说明语句:chare二‘\72‘;则变量c()A、包含1个字符B、包含2个字符C、包含3个字符D、说明不合法,c值不确定正确答案:A15、inta二5,使b不为2的表达式是()A、b=6一(---a)B、b=a%2C、b=a/2D、b=a>3? 2:1正确答案:B16、C++语言中用于注释的标识符是()A、&B、//C、*D、/正确答案:B17、数型数据在内存中的二进制编码方式是()A、补码B、原码C、ASCII码D、反码正确答案:A18、his指针存在的目的是()A、保证基类公有成员在子类中可以被访问B、保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码C、保证基类保护成员在子类中可以被访问D、保证基类私有成员在子类中可以被访问正确答案:B19、哪种派生方式中,派生类可以访问基类中的protected成员()A、public和privateB、public和protectedC、protected和privateD、仅protected正确答案:B20、行x二(6*7%8+9)/5;后,x的值为()A、1B、2C、3D、4正确答案:B21、类中声明的变量,下列描述中正确的是()A、属于全局变量B、只属于该类C、属于该类,某些情况下也可被该类不同实例所共享D、任何情况下都可被该类所有实例共享正确答案:C22、列说明中constchar^ptr;其中ptr应该是:()A、指向字符常量的指针B、指向字符的常量指针C、指向字符串常量的指针D、指向字符串的常量指针正确答案:C23、变量a是整型,f是实型,i是双精度型,则表达式10+'a,+i*f 值的数据类型是()A、intB、folatC、doubleD、不确定正确答案:C24、于类和对象不正确的说法是()A、类是一种类型,它封装了数据和操作B、对象是类的实例C、一个类的对象只有一个D、一个对象必属于某个类正确答案:C*q[5];等价的定义语句是()25、下与intA、intq[5];B、int*qC、int(q[5])D、int(*q)[5]正确答案:D26、izeof(float)是()A、一个双精度型表达式B、一个整型表达式C、一种函数调用D、一个不合法的表达式正确答案:B27、ntFunc(int,int);不可与下列哪个函数构成重载()A、intFHnc(int,int,int);B、doubleFunc(int,int);C、doubleFunc(double,double);D、doubleFunc(int,double);正确答案:B28、列哪个类型函数不适合声明为内联函数()A、函数体语句较多B、函数体语句较少C、函数执行时间较短D、函数执行时间过长正确答案:A29、列有关重载函数的说法中正确的是()A、重载函数必须具有不同的返回值类型B、重载函数参数个数必须相同C、重载函数必须有不同的形参列表D、重载函数名可以不同正确答案:C30、行语句x=(a二3,b=a---)后,x,a,b的值依次为()B=3A=2X=3A、3,2,3B、2,3,2C、3,3,2D、3,2,2正确答案:A31、有代数式3ae/bc,则不正确的c语言表达式是()A、a/b/c*e3B、3*a e/b/c*cC、3a e/bD、a e/c/c*3正确答案:C32、用值传递方式将实参传给形参,下列说法正确的是0A、形参是实参的备份B、实参是形参的备份C、形参和实参是同一对象D、形参和实参无联系正确答案:A33、果没有为一个类定义任何构造函数的情况下,下列描述正确的是0A、编译器总是自动创建一个不带参数的构造函数B、这个类没有构造函数C、这个类不需要构造函数D、该类不能通过编译正确答案:A34、有定义inta[10],*p=a;,则p+5表示()A、元素a[5]的地址B、元素a[5]的值C、元素a[6]的地址D、元素a[6]的值正确答案:A35、a=-3;执行(a〉0)?a:-a;后,a的值为()A、3B、1C、0D、一3正确答案:D36、使用关键字new所开辟的动态存储空间,释放时必须使用()A、fIreeB、createC、deleteD、cfile正确答案:C37、存在函数intmax(int,int)返回两参数中较大值,若求22,59, 70三者中最大值,下列表达式不正确的是()A、intm=max(22,max(59,70));B、intm=max(max(22,59),70);C、intm=max(22,59,70);D、intm=max(59,max(22,70));正确答案:C38、于类模板的说法正确的是()A、类模板的主要作用是生成抽象类B、类模板实例化时,编译器将根据给出的模板实参生成一个类C、在类模板中的数据成员具有同样类型D、类模板中的成员函数没有返回值正确答案:B39、于友元描述正确的是()A、友元是本类的成员函数B、友元不是本类的成员函数C、友元不是函数D、友元不能访问本类私有成员正确答案:B40、PC机中,"在内存占用的字节数是()A、1B、2C、3D、4正确答案:A41、有语句inta二3;,则执行了语句a+二a-二a*后,变量a的值是()A、3B、0C、9D、-12正确答案:D42、列正确的标识符是()A、hot_doB、a+bC、test!D、%y正确答案:A43、的私有成员可在何处访问0A、通过子类的对象访问B、本类及子类的成员函数中C、通过该类对象访问D、本类的成员函数中正确答案:D44、C语言中,合法的长整型常数是()A、0LB、4962710C、0.054838743D、 2.1869el0正确答案:A45、C++语言和C语言的兼容性,描述正确的是()A、C++兼容CB、C++部分兼容CC、C++不兼容D、C兼容C++正确答案:A46、写C++程序一般需经过的几个步骤依次是()A、编辑、调试、编译、连接B、编译、调试、编辑、连接C、编译、编辑、连接、运行D、编辑、编译、连接、运行正确答案:D47、贝构造函数的参数是()A、某个对象名B、某个对象的成员名C、某个对象的引用名D、某个对象的指针名正确答案:C48、C++中使用流进行输入输出,其中用于屏幕输出的对象是()A、cerrB、cinC、coutD、cfile正确答案:C49、所有变量均为整型,则表达式(a二2,b二5,b++,a+b)的值为()A、7B、8C、9D、2正确答案:A50、C语言中,要求运算数必须是整型的运算符是()A、/B、++D、%正确答案:D51、列关于类的权限的描述错误的是0A、类本身的成员函数只能访问自身的私有成员B、类的对象只能访问该类的公有成员C、普通函数不能直接访问类的公有成员,必须通过对象访问D、一个类可以将另一个类的对象作为成员正确答案:A52、x二8,执行语句y二x++,则y等于()A、6B、7C、8D、9正确答案:C53、intk二32767;执行k=k+l;后k值为()A、32768B、—32768C、0D、-1正确答案:A54、个类可包含析构函数的个数是()B、1个C、至少一个D、0个或多个正确答案:B55、于虚函数的描述中,()是正确的。

C++面向对象程序设计教程课后习题答案

C++面向对象程序设计教程课后习题答案

解析:修饰符const声明的常量只能被读取,该常量必须在声 明时进行初始化,并且它的值在程序中不能改变。选项B)没 有初始化,错误。选项C)定义了一个指向const double的指 针,其意义为指针 point指向的变量不能通过指针point来改变, D)中表示指针pt是常量指针,已在声明时进行了初始化。 答案:B
D)封装性
解析:封装性、继承性和多态性是面向对象思想的3个主要特征。 封装性指将数据和算法捆绑成一个整体,这个整体就是对象,描 述对象的数据被封装在其内部。继承性是指一种事物保留了另一 种事物的全部特征,并且具有自身的独有特征。多态性主要指当 多个事物继承自一种事物时,同一操作在它们之间表现出不同的 行为。 答案:C
cout << b[i] << " ";
// 输出b[i]
cout << endl;
// 换行
Sort(c, n); cout << "c:"; for (i = 0; i < n; i++)
cout << c[i] << " "; cout << endl;
// 对c排序 // 输出提示
// 输出c[i] // 换行
3.下列关于类和对象的叙述中,错误的是 。 A)一个类只能有一个对象 B)对象是类的具体实例 C)类是某一类对象的抽象 D)类和对象的关系就像数据类型和变量的关系
解析:在面向对象设计中,类是同一种对象的抽象,而不只是对 一个对象的抽象,一个类具有多个对象。对象是类的具体实例。 就像数据类型和变量的关系,一种数据类型可以定义多个变量, 一个变量却只能是一种数据类型。 答案:A

C语言程序设计帮助手册

C语言程序设计帮助手册

C 语言程序设计常量的概念常量:在程序运行过程中,其值不能被转变的量称为常量,又称字面常量。

例如:12,0,-3〔整型常量〕4.5,-1.3〔实型常量〕‘a’,‘b’,‘c’〔字符常量〕变量的概念变量:在程序运行过程中,其值能被转变的量称为变量,变量又称标识符。

C 语言变量的命名规章C 语言规定标识符可以由字母、数字以及下划线组成,必需以字母或下划线开头。

注:1.标识符区分字母的大小写。

2.标识符不能为C 语言中的关键字。

3.一般状况下标识符用小写字母表示。

变量与常量的区分:1.从存储空间上区分常量表示的是值,而变量是存放常量的存储空间。

2.从访问权限上区分变量的存储空间可供程序员访问修改,而常量的存储空间是不行访问修改的。

C 语言的关键字auto break case char constcontinue default do double elseenum extern float for gotoif int long register returnshort singed sizeof static structswitch typedef union unsigned voidvolatile whileC 语言的注释/*注释内容*/。

表示“/*”开头,直到“*/”完毕均作为注释,可占多行。

〔又称多行注释〕根本数据类型整型常量十进制常量〔由0~9 个数字组成〕。

八进制常量〔由0~7 个数字组成,必需以0 开头〕。

十六进制常量〔由0~9 个数字和大小写A~F 组成。

必需以0x 开头〕。

整型类型类型说明类型标识符比特字节取值范围有符号整型[signed] int 16 2-32768~+32767 即-2^15~(2^15-1)无符号整型unsigned int 16 20~+65535 即0~(2^16-1)有符号短整型[signed] short [int] 16 2-32768~+32767 即-2^15~(2^15-1)无符号短整型unsigned short [int] 16 20~+65535 即0~(2^16-1)有符号长整型[signed] long [int] 32 4-2147483648~+2147483647 即-2^31~(2^31-1)无符号长整型unsigned long [int] 32 40~+4294967295 即0~(2^32-1)注:1. 假设一个整型常量在-32768~+32767 范围内,则认为是[signed] int 型。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

重 载 函 数
14.2 常量成员函数
class Circle{ public: Circle(double r); // 构造函数 double area() const ; // 常量成员函数 double perimeter() const ; // 常量成员函数 double getRadius() const ; // 常量成员函数 private: double radius; const double PI; // 常量数据成员 }; Circle::Circle(double r): radius(r), PI(3.1415) { } double Circle::area() const { return PI*radius*radius; 建议:将不修改类数据成员值的 } double Circle::perimeter() const { 成员函数定义为常量成员函数。 return 2*PI*radius; } double Circle::getRadius() const { return radius; 注意:在类外实现常量成员函数时也要带const }
常量是一个在程序执行过程中其值不能改变的量。C++通过关 键字 const 来定义一个常量。常量在定义时必须进行初始化! 例: const double PI = 3.1415; const double DC; PI = 3.1415926; // 常量定义并初始化 // 错误!必须进行初始化! // 错误!不允许修改!
14.4 静态数据成员
类是类型而不是具体的数据对象,类的对象都是该类的实 例,每个类对象都具有自己的数据成员,而且是相互独立,各 自占内存空间。 然而,程序中往往需要让类的所有对象在类的范围内共享 某个数据。 Student private: int count; // 班级人数
通过静态数据成员来实现
{ //… }
类外: 类型标识符 类名::成员函数名(参数列表) const // 实现
{ //… }
14.2 常量成员函数 说明:
• const 是函数类型的一个组成部分,因此在实现部分也要带 const 关键字。 • 常量成员函数不更新对象的数据成员,也不能调用该类中没 有用 const 修饰的成员函数。 • const 关键字可以参与区分重载函数。
14.2 常量成员函数
class Circle{ public: Circle(double r): radius(r), PI(3.1415) // 初始化表 {} double area() const { // 常量成员函数 return PI*radius*radius; } double perimeter() const { // 常量成员函数 return 2*PI*radius; } double getRadius() { // 普通成员函数 return radius; } double getRadius() const { // 重载常量成员函数 return radius; } private: double radius; const double PI; // 常量数据成员 };
注意:常对象只能调用它的常量成员函数,而不能调 用其他成员函数。
14.3 常对象
#include <iostream> using namespace std; class Rectangle{ public: Rectangle(): width(0.0), height(0.0) { } // 默认构造函数 Rectangle(double w, double h): width(w), height(h) { } // 带参数的构造函数 double area() const { // 常量成员函数 return width*height; } double perimeter() const { // 常量成员函数 return 2*(width+height); } void print(){ // 普通成员函数 cout<<“Width: ”<<width<<“, Height: ”<<height<<endl; } void print() const { // 重载常量成员函数 cout<<“Width: ”<<width<<“, Height: ”<<height<<endl; } private: double width; double height; };
14.4 静态数据成员 静态数据成员:
• 静态数据成员通过 static 关键字进行定义。 • 所有对象的静态数据成员占用同一个内存空间(只有一份)。 • 静态数据成员可以实现数据共享。 • 静态数据成员属于一个类而不属于该类的任何对ቤተ መጻሕፍቲ ባይዱ。 • 静态数据成员可以独立于对象存在和被引用。
14.4 静态数据成员 静态数据成员定义:
14.1 常量数据成员
#include <iostream> #include <cstring> using namespace std; class Student{ public: Student(char *_name, int _id, bool _sex): id(_id), sex(_sex){ name = new char[strlen(_name)+1]; strcpy(name, _name); 常量数据成员: } const 类型 标识符; ~Student() { if(name!=NULL) 类型 const 标识符; delete [ ] name; } int main(){ const char * getName() { return name; } Student p(“John”, 11151, true); int getID() { return id; } cout<<“姓名: ”<<p.getName()<<endl; bool getSex() { return sex; } cout<<“学号: ”<<p.getID()<<endl; protected: cout<<“性别: ”<<p.getSex()<<endl; char *name; // 姓名 return 0; int const id; // 学号 } bool const sex; // 性别 };
static 类型标识符 静态数据成员名; // 类内
静态数据成员初始化:
类型标识符 类名::静态数据成员名 = 初始值; // 类外
说明:
• 静态数据成员的初始化放在类体外进行(必须初始化)。 • 初始化时前面不允许再加 static 关键字。 • 初始化时使用作用域运算符来标明它所属的类。 • 访问静态数据成员: 类名::静态数据成员名
14.3 常对象 常对象(const 对象):
常对象的所有数据成员在程序执行过程中都不能被修改。
定义形式:
const 类名 对象名; 或 const 类名 对象名(参数列表);
类名 const 对象名; 或 类名 const 对象名(参数列表);
例: const Circle cp(13.14); Circle const cp(13.14); // 常对象定义 // 常对象定义
14.2 常量成员函数 常量成员函数(const 成员函数):
• 常量成员函数只能引用类中的数据成员而不能修改它们的值。
• 只有常量成员函数才有资格操作常对象。
定义形式: 类内: 类型标识符 成员函数名(参数列表) const; 类型标识符 成员函数名(参数列表) const // 声明 // 定义
14.3 常对象
int main() { Rectangle rect1(2.0, 3.0); // 普通对象 cout<<“Area: ”<<rect1.area()<<endl; // 调用常量成员函数 rect1.print(); // 调用普通成员函数
const Rectangle rect2(4.0, 5.0); // 常对象 cout<<“Area: ”<<rect2.area()<<endl; // 调用常量成员函数 rect2.print(); // 调用常量成员函数
return 0; }
常对象只能调用常量成员函数,而普通对象既可以调用 普通成员函数,也可以调用常量成员函数。但当发生 const重载时,普通对象调用是非const成员函数,而常 对象调用的是带const的成员函数。
Ch14_01
14.3 常对象
#include <iostream> using namespace std; class Complex{ public: Complex(double r = 0.0, double img = 0.0): real(r), image(img) { } void set(double r, double img) { real = r; image = img; } double getReal() const { return real; } double getImage() const { return image; } void print() const { cout<<real<<“+”<<image<<“i”<<endl; } private: double real; double image; }; void add(const Complex &cp1, const Complex &cp2){ Complex result; result.set(cp1.getReal()+cp2.getReal(), cp1.getImage()+cp2.getImage()); result.print(); } int main(){ const引用对象和const指针对 Complex cp1(1.0, 2.0), cp2(3.0, 4.0); 象只能访问类的常量成员函数。 add(cp1, cp2); return 0; }
相关文档
最新文档