类、类的构造函数和析构函数、this指针、对象数组
1.C++区别于C语言的面向对象特性:抽象、封装和数据隐藏、多态、继承、代码的可重用性
2.封装:将实现细节放在一起并将它们与抽象分开。
3.数据隐藏(将数据放在类的私有部分中)是一种封装。数据隐藏可以是数据变的安全,同时使得类的用户无需关心数据是被如何表示的。
4.类对象默认访问控制类型为私有(即未显示声明的变量默认为私有)。
5.定义位于类内部的函数都自动成为内联函数。内联函数要求在每个使用它们的文件中都定义它,因此可以把它的定义放在定义类的头文件中。
6.对于一个类的不同对象,它们拥有各自的内存用于存储各自的内部变量和类成员,但公用一个类方法。
7.使得打印显示两位小数的格式:
cout.setf(ios_base::fixed); //其中,ios_base是std名称空间中的一个子空间
cout.precision(2);
cout.setf(ios_base::showpoint);
8.构造函数没有声明类型,在程序声明对象时将自动调用构造函数。同时,构造函数的参数不能和类成员同名(防止赋值冲突)。
程序声明对象时自动调用构造函数。
显示调用构造: Stock food = Stock ("World", 2, 1,25);
隐式调用构造: Stock garment("Furry", 50, 2.5);
用new动态分配内存: Stock *pstock = new Stock("Electroshock ", 50 ,2.5);
上面的情况相当于new了一个无名的Stock对象,并用指针pstock对它进行管理。
构造函数可以创建对象,但不能被对象调用。因为在调用构造函数构造对象之前,这个对象并不存在。
9.关于默认构造参数可以参考链接https://blog.csdn.net/simon_2011/article/details/78129898
默认构造参数有两种形式,一种是形如Stock stock() { co="Error",shares =0,val =10.3 }; //未指定参数
另一种是形如Stock stock( const char* m_co="Error",int n=0,double m_val =10.3) { ... }; //指定参数
这两种情况都是默认构造参数,当类中定义了以上两种中的一种,则编辑器就不会再自动生成默认构造了。但两种不能同时定义。默认构造参数存在的意义是为了能够声明 Stock stock1(未给初始化值的对象)或new一个没有给定值的指针。但是允许默认构造参数与构造参数同时存在。如用户可以同时定义上面的一种默认构造参数与如下声明:
Stock::Stock(int n,double m_val)
{
shares=n;
val=m_val;
}
10.如果构造函数用new定义,则析构函数里将调用delete,如果构造函数没有New,则根据生存期,析构函数不用对对象进行操作。
11.可以将一个对象赋给同类型的另一个对象。
12.Stock stock2= Stock("Boffo Objects",2,2.0);
与Stock1=Stock("Nofty Foods",10,50.0);
之间有很大不同。第一条是初始化语句,创建有指定值的对象,可能会创建临时对象(也可能不会,若创建临时对象,会调用对应的临时对象的析构函数),第二条语句是赋值,赋值过程中使用构造函数总会导致在赋值前创造一个临时对象。
初始化的效率要比赋值效率更高。
13.类方法(类的成员函数)不修改调用对象时,可以将它声明为const,声明的方法为将const放在函数定义的开头,如:
void stock::show( ) const
14.创建类对象数组必须该类有默认构造函数,因为:初始化对象数组首先使用默认构造函数创建数组元素然后用构造函数(未必是默认构造)创建临时对象,再将临时对象的内容复制到相应元素中一一对应。所以要建立类对象数组必须要有默认构造。
15.由于类中声明的常量作用域为整个类,但由于声明类的过程并不分配内存只是描述对象的形式,因此不能在类声明中为其分配内存,如下面描述是错误的:
class Stock
{
private:
const int Len=30; //注意,此种方法是错误的
char company[Len];
}
可以有两种方法更正,一种是使用enum{ Len = 30 }; 的方式替代,用枚举类型并不会创建对应的类数据成员,即所有类的对象中都不会包含这个枚举,且Len只是一个符号,不被分配内存,编译器将使用30替换它。
另一种方法是 static const int Len=30; 这种方法引用static关键字,常量Len被存储在静态变量存放的位置,而不会被存储在对象中,因此Len常量将只有一个,被所有的Stock对象共享。