C++类的成员变量和成员函数
- 格式:docx
- 大小:17.05 KB
- 文档页数:4
C++类的定义和对象C++类的定义和对象类的成员变量称为类的属性(Property),将类的成员函数称为类的⽅法(Method)。
在⾯向对象的编程语⾔中,经常把函数(Function)称为⽅法(Method)。
类的定义class Student{public://成员变量char *name;int age;float score;void say(){cout<<name<<age<<score<<endl;}};类只是⼀个模板(Template),编译后不占⽤内存空间.class C++ 中新增的关键字,⽤来定义类。
成员变量和成员函数,它们统称为类的成员(Member)创建对象:Student Lilei; //创建对象Student是类名,liLei是对象名。
和使⽤基本类型定义变量的形式类似, 从这个⾓度考虑,我们可以把 Student 看做⼀种新的数据类型,把 liLei 看做⼀个变量。
在创建对象时,class 关键字可要可不要class Student LiLei; //正确Student LiLei; //同样正确还可以创建对象数组:Student allStu[100];使⽤对象指针:Student stu;//pStu 是⼀个指针,它指向 Student 类型的数据,通过 Student 创建出来的对象Student *pStu = &stu;在堆上创建对象,这个时候就需要使⽤前⾯讲到的new关键字Student *pStu = new Student;使⽤ new 在堆上创建出来的对象是匿名的,没法直接使⽤,必须要⽤⼀个指针指向它,再借助指针来访问它的成员变量或成员函数.对象指针后,可以通过箭头->来访问对象的成员变量和成员函数;两种创建对象的⽅式:⼀种是在栈上创建,形式和定义普通变量类似;另外⼀种是在堆上使⽤ new 关键字创建,必须要⽤⼀个指针指向它,读者要记得 delete 掉不再使⽤的对象C++类的成员变量和成员函数在定义类的时候不能对成员变量赋值,因为类只是⼀种数据类型或者说是⼀种模板,本⾝不占⽤内存空间,⽽变量的值则需要内存来存储.类的成员函数也和普通函数⼀样,都有返回值和参数列表,它与⼀般函数的区别是:成员函数是⼀个类的成员,出现在类体中,它的作⽤范围由类来决定;⽽普通函数是独⽴的,作⽤范围是全局的,或位于某个命名空间内.只在类体中声明函数,⽽将函数定义放在类体外⾯,如下图所⽰:class Student{public://成员变量;char *name;int age;float score;//声明成员函数;void say();};//定义成员函数void Student::say(){cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;}类体内成员函数默认为内联函数; inline 关键词是多余的;类体外定义 inline 函数的⽅式,必须将类的定义和成员函数的定义都放在同⼀个头(源)⽂件中.C++类成员的访问权限以及类的封装成员访问限定符publicprivateprotected只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分类的内部(定义类的代码内部):⽆论成员被声明为 public、protected 还是 private, 都是可以互相访问的,没有访问权限的限制.在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。
C++学习笔记const修饰类成员与成员函数⼀、常数据成员常数据成员,已经初始化就不可以改变1const int m; //const 数据类型数据成员名2int const s; //数据类型 const 数据成员名被const修饰的成员必须进⾏初始化,并且不能被更改。
⽽初始化的⽅式则是在类的构造函数的初始化列表⾥进⾏的。
1class Clock234 Clock(int a,int b,int c):h(a),m(b),s(c)//类的构造函数的初始化列表通常把常数据成员定义为静态成员,使其成为类的⼀个常量1private:static const int x; //静态常量类内申明,类外初始化其中x为static类型,因其静态化的特殊性,需要在类外初始化,即便为私有类型;⼆,常成员函数const成员函数可以使⽤类中的所有成员变量,但是不能修改他们的值,这种措施主要为了保护数据⽽设置。
const成员函数也称常成员函数。
需要在声明和定义的时候在函数头部的结尾加上const关键字1char *getname() const;2int getage() const;3float getscore() const;常成员函数只能调⽤常成员函数,⽽不能调⽤⾮常成员函数,访问但不可以更改⾮常成员变量。
注意:但是有⼀种情况例外,如果成员申明时加关键字mutable后,在常函数中依然可以修改1//类名 *p=this;2//普通类成员函数this指针:T* const(表⽰指针本⾝不能修改)3//常成员函数this指针类型:const T* const(表⽰指针本⾝同时指针指向的内容不能修改)4//类名 * const p=(类名* const)this;56//p->成员=123;可以修改成员参数三,常对象 常对象是指该对象在其⽣命周期内,其所有的数据成员的值都不能被改变;定义对象时加上关键字const,该对象就是常对象,其⼀般形式如下:1const class object(params);2class const object(params);345//定义const指针6const class *p = new class(params);7class const *p = new class(params);⼀旦将对象定义为常对象之后,不管是哪种形式,该对象就只能访问被 const 修饰的成员了(包括 const 成员变量和 const 成员函数),因为⾮ const 成员可能会修改对象的数据(编译器也会这样假设),C++禁⽌这样做。
C++中各种数据成员及成员函数的定义及使⽤转载于:1.类是⾃定义的数据类型.类与应⽤程序不同,类的功能虽然独⽴,但不能独⽴启动,就象汽车零件那样.2.Class 是⼀种数据类型, 其变量为对象.对象包含有member variables(成员变量)和member1 functions(成员函数).2class Date{3int year, month, day;4public:5void set(int y,int m,int d); // 赋值操作6bool isLeapYear(); // 判断闰年7void print(); // 输出⽇期8 };3.在类(class)中 , 成员函数及成员变量会分为两⼤类 : public members (公开成员)、private members (私有成员)1.) public members :被定义为public members 的成员函数及成员变量 , 可在任何的函数中被使⽤ .包括main函数,及其它⾮成员函数.2.) private members :被定义为private members 的成员函数及成员变量 , 只能在成员函数中被使⽤ .4.成员函数在类外部定义时,在函数名称前应加上⽇期类名前缀Date和命名空间引导符“::”,它表⽰着⾃⼰属于某⼀个名空间(类),与普通函数相区别。
1void Date::set(int y,int m,int d) { year=y; month=m; day=d; }成员函数可以在类内,也可以在类外定义,若在类内定义,则默认为内联函数(inline)5.对象是拥有操作的实体,是由类创建的6.访问成员函数的⽅式(1)对象⽅式 Date d; d.set(2011,12,5);(2)对象指针⽅式1 Date* dp = new Date;2 dp->set(2011,12,5);3// …4delete dp;7.成员函数的操作,如果只对对象进⾏读操作,则该成员函数可以设计为常对象成员函数,好处是让使⽤者⼀⽬了然的知道该成员函数不会改变对象值,同时让类的实现者更⽅便地调试。
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; // 这⾏代码是错误的静态函数成员必须通过对象名来访问⾮静态数据成员。
数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入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类的定义格式》在C++编程语言中,类是一种非常重要的数据结构,它允许我们创建自定义的数据类型,并实现对象的封装、继承和多态等特性。
类的定义格式是类声明的重要组成部分,它规定了类的名称、成员变量、成员函数以及它们的作用域和访问权限等。
C++类定义的基本格式如下:```cppclass类名{public://公共成员变量和成员函数private://私有成员变量和成员函数};```其中,`class`关键字用于声明一个类,`类名`是该类的名称,大写字母开头是类名的约定。
`public`和`private`关键字用于指定类的成员变量的访问权限,后面的部分则是成员变量的定义和成员函数的声明。
二、成员变量和成员函数类中可以包含各种类型的成员变量和成员函数。
成员变量包括数据成员和友元成员,它们用于存储类的数据和行为;成员函数包括构造函数、析构函数和普通成员函数,它们用于操作类的对象。
成员函数的定义必须在类内部,而成员变量的定义则可以在类内部或外部。
三、访问修饰符访问修饰符用于控制成员变量的可见性和访问权限。
在C++中,常见的访问修饰符有`public`、`protected`和`private`。
其中,`public`表示公开可见,可以在类的外部访问;`protected`表示受保护的,只能在同一个类及其派生类中访问;`private`表示私有,只能在类内部访问。
根据实际需求选择合适的访问修饰符,可以提高代码的可读性和可维护性。
四、构造函数和析构函数构造函数和析构函数是类的特殊成员函数,用于初始化对象和清理对象。
构造函数是在创建对象时自动调用的特殊函数,可以用于设置对象的初始状态;析构函数是在对象不再需要时自动调用的特殊函数,可以用于释放对象占用的资源。
在类定义中,必须至少声明一个构造函数,以便在创建对象时进行初始化。
五、示例代码下面是一个简单的C++类的定义示例:```cpp#include<iostream>usingnamespacestd;classCircle{public:Circle(intr):radius(r){}//构造函数的声明和初始化私有数据成员的方式不同类方法的原因(你指的是访问修饰符,没有在这里改变修饰符的意义)private:intradius;//私有成员变量doublearea;//私有成员变量doublecircumference;//私有成员变量doublecalculateArea(){return3.14*radius*radius;}//私有成员函数doublecalculateCircumference(){return2*3.14*radius;}//私有成员函数};voidprintArea(){cout<<"Area="<<area<<endl;}//公有成员函数voidprintCircumference(){cout<<"Circumference="<<circumferenc e<<endl;}//公有成员函数};```这个类定义了一个圆形对象,包含了半径、面积、周长等属性以及计算这些属性的方法。
c类与结构体的异同C语言中的结构体和类是两种重要的数据类型,它们在定义和使用上有许多相似的地方,但也存在一些不同点。
下面从几个方面来探讨一下C类与结构体的异同。
一、定义方式结构体定义的方式与类的定义方式非常接近,都是通过关键字struct和class进行声明定义。
但是结构体定义中没有类中的访问修饰符(public、protected、private),并且结构体的成员变量默认为public类型。
二、成员变量C语言中的结构体和C++中的类都可以包含成员变量,但C++的类有访问限制符(public、protected、private)。
而结构体中写不写关键字public、protected、private都没有影响,结构体的成员变量默认被视为公共成员。
三、成员函数C++中的类具有自定义的成员函数,而C语言中的结构体是不支持成员函数的。
不过C语言中可以使用指向函数的指针来模拟实现成员函数的效果。
四、继承C语言中的结构体不支持继承,而C++中的类支持继承。
在C++中,通过继承可以使得类之间的关系更加清晰和简单,还能够方便地实现代码复用。
五、实例化C++中的类必须实例化成对象之后才能使用,而结构体不需要进行实例化。
在C语言中,可以直接定义一个结构体变量,并且可以直接访问结构体中的成员变量。
而C++中,需要通过定义一个类的对象才能使用类中的成员变量和函数。
六、运算符重载C++中的类支持运算符重载操作,而C语言中的结构体不支持这一操作。
通过运算符重载,可以使类的对象在使用运算符进行操作的时候更加的灵活和方便,提高了代码的可读性和可维护性。
总结:从定义方式、成员变量、成员函数、继承、实例化以及运算符重载等方面来比较C类和结构体之间的异同,不难发现,C语言中的结构体更加的简单和直观,而C++中的类更加的灵活和强大。
对于选择使用哪种数据类型,我们需要根据不同的开发需求和场景来选择。
c++的类定义C++是一种面向对象的编程语言,支持类的定义和使用。
类是一种用户自定义的数据类型,它将数据和对数据的操作封装在一起。
类定义了对象的属性和方法,通过实例化类可以创建具体的对象。
类的定义通常包括类名、成员变量和成员函数。
类名是用于标识类的名称,成员变量是类的属性,用于存储对象的数据,而成员函数是类的操作,用于处理对象的行为。
下面是一个示例的类定义:```cppclass Rectangle {private:double length;double width;public:Rectangle(double len, double wid) {length = len;width = wid;}double getArea() {return length * width;}double getPerimeter() {return 2 * (length + width);}};```在上面的代码中,我们定义了一个名为`Rectangle`的类。
该类有两个私有成员变量`length`和`width`,用于存储矩形的长度和宽度。
同时,该类还有一个公有构造函数和两个公有成员函数。
构造函数用于创建对象,并初始化对象的成员变量。
成员函数则用于对对象进行操作,计算矩形的面积和周长。
在实际使用中,我们可以通过以下方式来使用该类:```cppint main() {Rectangle r(5.0, 3.0);double area = r.getArea();double perimeter = r.getPerimeter();cout << "Area: " << area << endl;cout << "Perimeter: " << perimeter << endl;return 0;}```在上述的`main`函数中,我们创建了一个名为`r`的矩形对象,并传入长度和宽度的参数。
MFC常用类及其成员函数CRuntimeClass结构在CRuntimeClass结构中定义了类名、对象所占存储空间的大小、类的版本号等成员变量及动态创建对象、派生关系判断等成员函数。
每一个从CObject 类派生的类都有一个CRuntimeClass结构同它关联,以便完成在运行时得到对象的信息或基类的信息。
要使用CRuntimeClass结构,必须结合使用RUNTIME_CLASS()宏和其他有关运行时类型识别的MFC宏。
CCmdTarget类(1)消息发送MFC应用程序为每个CCmdTarget派生类创建一个称为消息映射表的静态数据结构,可将消息映射到对象所对应的消息处理函数上。
(2)设置光标BeginWaitCursor() 将光标改为沙漏形状;EndWaitCursor() 将光标改回到之前的形状;RestoreWaitCursor()用于将光标还原为等待状态。
(3)支持自动化CCmdTarget类支持程序通过COM接口进行交互操作,自动翻译COM接口的方法。
CWinThread类由CCmdTarget派生,主要工作是创建和处理消息循环。
CWinApp类从CWinThread类派生,成员函数InitApplication()、InitInstance()、Run()。
在InitInstance()函数中,创建了一个单文档模板类或多文档模板类(CDocTemplate)的对象,并且在文档模板的构造函数中,系统定义的宏RUNTIME_CLASS创建了文档类对象,框架窗口类对象和视图类对象.在MFC应用程序中有且仅有一个CWinApp派生类的对象,代表程序运行的主线程,代表应用程序本身。
CWnd类由CCmdTarget类直接派生,是MFC中最基本的GUI对象。
公共变量m_hWnd 用于存放供API函数调用的窗口句柄。
CframeWnd类从CWnd类派生而来,主要用来掌管一个窗口。
其对象是一个框架窗口,包括边界、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。
类这种数据类型是一个包含成员变量和成员函数的集合。
类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。
但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。
类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。
上节我们在示例中给出了Student 类的定义,如下所示:
1.class Student{
2.public:
3.//成员变量
4.char*name;
5.int age;
6.float score;
7.
8.//成员函数
9.void say(){
10.cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
11.}
12.};
这段代码在类体中定义了成员函数。
你也可以只在类体中声明函数,而将函数定义放在类体外面,如下图所示:
1.class Student{
2.public:
3.//成员变量
4.char*name;
5.int age;
6.float score;
7.
8.//成员函数
9.void say();//函数声明
10.};
11.
12.//函数定义
13.void Student::say(){
14.cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
15.}
在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。
称作用域运算符或作用域限定符),用来连接类名和函数名,指明当前函数属于哪个类。
成员函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前。
inline 成员函数
在类体中和类体外定义成员函数是有区别的:在类体中定义的成员函数会自动成为内联函数,在类体外定义的不会。
当然,在类体内部定义的函数也可以加inline 关键字,但这是
多余的,因为类体内部定义的函数默认就是内联函数。
内联函数一般不是我们所期望的,它会将函数调用处用函数体替代,所以我建议在类体内部对成员函数作声明,而在类体外部进行定义,这是一种良好的编程习惯,实际开发中大家也是这样做的。
当然,如果你的函数比较短小,希望定义为内联函数,那也没有什么不妥的。
如果你既希望将函数定义在类体外部,又希望它是内联函数,那么可以在定义函数时加inline 关键字。
当然你也可以在函数声明处加inline,不过这样做没有效果,编译器会忽略函数声明处的inline,我们已在《如何规范地使用C++内联函数》中对这点进行了详细讲解。
下面是一个将内联函数定义在类外部的例子:
1.class Student{
2.public:
3.char*name;
4.int age;
5.float score;
6.
7.void say();//内联函数声明,可以增加inline 关键字,但编译器会忽略
8.};
9.
10.//函数定义
11.inline void Student::say(){
12.cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
13.}
这样,say() 就会变成内联函数。
这种在类体外定义inline 函数的方式,必须将类的定义和成员函数的定义都放在同一个头文件中(或者同一个源文件中),否则编译时无法进行嵌入(将函数代码的嵌入到函数调用出),具体原因我们已在《如何规范地使用C++内联函数》中进行了讲解。
再次强调,虽然C++ 支持将内联函数定义在类的外部,但我强烈建议将函数定义在类的内部,这样它会自动成为内联函数,何必费力不讨好地将它定义在类的外部呢,这样并没有任何优势。