C++入门(二)【类】

  • 类规范由两个部分组成:
    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];}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值