-
类规范由两个部分组成:
1.类声明:以数据成员的方法描述数据部分,以成员函数(简称方法)的方式描述公有接口;
2.类方法定义:描述如何实现类成员函数。 -
通常程序员将接口(类定义)放在头文件中,将实现(类方法的代码)放在源代码文件中。
-
private与public表示了对类成员的访问限制。只能通过公有成员函数(或友元函数)来访问对象的私有成员。
-
由于隐藏数据是OOP的主要目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分。(成员函数也可放在私有部分,用来处理不属于公有接口的实现细节)
-
在类以外定义成员函数时,除了有函数头、函数体、返回类型与参数以外,需要用::来标识函数所属的类、类方法可以访问类的private组件。【update()的函数头为 void Stock::update(double price)】
-
1.成员:在类声明中,用来存储数据的类数据成员。如Stock类中的company,shares。(C++ primer plus P343)
2.成员函数(/类函数成员/方法):在类声明中定义,在源代码中表示。如Stock类中的acquire,buy函数。
3.对象:在主函数中,如果要声明Stock类型的变量:Stock sally。其中sally就是对象/实例。表示一个股票名字。
4.类型名:类的名字,首次定义是在类定义中。Stock类的Stock就是它的类型名。
5.内联方法:定义位于类声明中的函数就是内联函数。如Stock里的set_tot。【也可在类声明之外定义成员函数,并使其成为内联函数:需要在定义函数前使用inline字符】 -
使用对象的成员函数
Stock kate,joe; //创建了两个Stock类的对象:kate与joe kate.show(); joe.show();
-
新建一个项目,要使用类的头文件,在开头有
#include"stock00.h"
依然提示无法打开源文件的解决方法:
1.项目->属性->C/C+±>常规->附加包含目录 将头文件所在的路径复制粘贴上去;
2.项目 -> 属性 ->C/C+±>常规 中的使用Windows运行时扩展 选择否。 -
依然是上面的那个情况。新建一个项目,要使用类,在运行程序时,出现“无法解析的外部符号”的问题。解决方案:1.将类的头文件和声明文件合并在一起,即将stock00.h与stock00.cpp合并在一起,直接写成stock00.h;【此方法不建议使用】2.将stock00.cpp改为stock00.implate,并在stock00.h后面加上
#include“stock00.implate”
-
在上面运行时,可能会出现警告:未初始化变量。解决:在stock00.h中,声明变量时同时初始化=0。
-
setf()函数是用来规范数字格式的:如是否使用科学计数法,显示几位小数等。具体使用见:https://blog.csdn.net/baishuiniyaonulia/article/details/79144033。
-
构造函数
作用:专门用于构造新对象,将值赋给它们的数据成员。
名称与类名相同,虽然没有返回值,但函数头没有void,后面也没有return。
构造函数存在的意义是:需要在创建对象时,自动对它进行初始化。
程序声明对象时,将自动调用构造函数。
如果定了构造函数后,程序员就必须为它提供默认构造函数。【如果要创建对象,而不将其显式地初始化,则必须定义一个不接受任何参数的默认构造函数,如Stock::Stock(){ }
】
定义默认构造函数的两种方法:1.给已有构造函数的所有参数提供默认值Stock(const string &co="error",int n=0,double pr=0.0);
2.通过函数重载定义另一个构造函数Stock();
大多数情况下,用户定义的默认构造函数是给所有成员提供隐式的初始值。
调用构造函数的方法:1.显示地调用Stock food=Stock("world cabbage",250,1.25);
2.隐式地调用Stock food("world cabbage",250,1.25);
-
析构函数
类Stock的析构函数是~Stock()。析构函数没有参数,因此析构函数的原型必须是~Stock();
通常不会在代码中显示地调用析构函数(new创建对象的时候,在用delete释放内存时,析构函数将被自动调用)
如果没有定义析构函数,编译器将隐式地声明一个默认析构函数,并在发现导致对象被删除的代码后,提供默认析构函数的定义。 -
C++11中允许对类用列表初始化。
Stock hot_tip={"derivative",100,45.0};
等价于Stock hot_tip {"derivative",100,45.0};
-
this指针:所有的类方法,都是将this指针设置为调用它的对象的地址。(隐式)
-
定义作用域为类的常量:
不能用class Bakery { private: const int Months=12; double cost [Months];
}
因为声明类时,只是描述了对象的形式,并没有创建对象,因此,在创建对象前,将没有用于存储值的空间。
有两种方法:1.枚举:class Bakery { private: enum{Months=12}; double cost [Months];
}此时Months只是一个符号名称,在类的作用域中遇到它,将用12代替它。【此处枚举只是为了创建符号常量,并不打算创建枚举类型的变量,因此不需要提供枚举名。】
2.使用关键字staticclass Bakery { private: static const int Months=12; double cost [Months];
}
C++入门(二)【类】
最新推荐文章于 2023-08-15 11:56:51 发布