C++类(随手记)

1.定义位于类声明中的函数将自动成为内联函数,也可以在类声明外定义成员函数,并使其成为内联函数。(为此,只需要在类实现部分中定义函数时,使用inline限定符)

2.所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。

3.构造函数没有类型

4.为了避免构造函数的参数名和数据成员名相同造成混乱,常在成员名前使用"m_"前缀或者“_”作为后缀

5.两种方法使用构造函数来初始化对象

(1)Stock food = Stock("World cabbage".50,2.5);

(2)Stock food("World cabbage".50,2.5);

每次创建类对象(包含new动态分配内存时),C++都会使用类构造函数。将构造函数和new联用的时候

Stock *pstock = new Stock("Games",18,19.0);

这种情况下,该对象没有名字,但是可以使用指针来管理该对象。

6.默认构造函数:

Stock first();-------声明一个返回Stock的函数

Stock second;-------隐式调用默认构造函数,不需要使用圆括号

在未提供显示初始值时,用来创建对象的构造函数。

定义默认构造函数的方式有两种,

(1)给已有的构造函数的所有参数提供默认值;

Stock(const string &co = "Error", int n = 0; double pr = 0.0);

(2)通过函数重载来定义一个没有参数的构造函数


调用构造函数的方式:

Stock first;----------隐式调用默认构造函数

Stock first = Stock();-----显式的调用构造函数???调用的顺序

Stock stock2 = Stock("Boffo Objects",2,2.0);

C++允许编译器使用两种方式来执行这种语法:

1.创建并初始化一个名为stock2的对象。 

2.这种方式是允许调用构造函数来创建一个临时对象,然后将该临时对象复制到stock2中,并丢弃它。如果编译器使用这种方式,则将为临时对象调用析构函数,

析构函数的调用的时间由编译器来选择。

Stock *prelief = new Stock;---------隐式调用构造函数

3.Stock stock1("NanoSmart",12,20.0);

stock1 = Stock("Nifty Poods",10,50.0);-------------这句话中,stock1已经存在,因此这句话不是对stock1进行初始化,而是将新值赋给它。这是通过让构造程序

创建一个新的、临时的对象,然后将其内容复制给stock1来实现的。随后调用析够函数,以删除该临时对象,有些编译器删除临时对象的时间由延迟。

类的局部变量存放在栈中,因此最后被创建的变量首先被删除。


6.2-----C++11列表初始化

6.3-----const成员函数

如声明:

const Stock land = Stock("123");

land.show();

编译器会拒绝上述第二行,因为show代买无法确保调用对象不被修改,也可以将函数参数声明为const引用或者指向const的指针来解决这个问题,但是show()并没有

任何参数,C++的解决方法是讲const关键字放在函数的括号后面:如下声明和定义

void show() const;

void stock::show() const;

这种方法声明和定义的类函数被称为const成员函数,只要类方法不修改调用对象,就应将其声明为const。

6.4---tips

1.接受一个参数的构造函数允许使用复制语法将对象初始化为一个值,例如,Bozo tubby = 32,这有可能会带来一些意外,这个特性可以关闭。

2.默认构造函数没有参数,因此如果创建对象时没有进行显示的初始化,则将调用默认的构造函数,如果程序中没有提供任何构造函数,则编译器会为

程序定义一个默认构造函数;否则,必须自己提供默认构造函数。默认构造函数可以没有任何参数,如果有,则必须所有参数都提供默认值。

例如:Stock::Stock(const std::string &co = "123",long n = 0,double pr = 0.0);

Bozo tubby;使用默认构造函数

Bozo *pb = new Bozo;也使用默认构造函数


7.析构函数

用构造函数创建对象后,程序负责跟踪该对象,直到过期,程序将自动调用析构函数。

调用析够函数的时机通常由编译器作决定,而不应再代码中显示的调用析构函数。

(1)如果创建的是静态存储类对象,则其析构函数在程序结束时自动被调用

(2)如果创建的是自动存储类对象,则其析构函数在程序执行完代码块时自动调用

(3)如果对象通过new创建,则它将驻留在栈内存或者自由存储区中,当使用delete来释放内存时,将会调用析构函数。

(4)另外程序会创建临时对象来完成特定的操作,这种情况下,程序将在结束的时候对该对象调用析构函数。


8.this指针

隐式的传入成员函数



9.对象数组

9.1对象数组的声明:

Stock mystuff[4];

9.2对象数组的初始化

列表初始化,针对每个成员可以使用不同的构造函数

初始化对象数组的方案是:首先私用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中,

因此,要撞见类对象数组,则这个类必须有默认构造函数


10.类作用域

作用域为类的常量

class Bakery{

private:

const int Months = 12;

double costs[Months];

.....

上述语句是行不通的,因为声明类知识描述了对象的形式,并没有创建对象。

因此在创建对象钱,将没有用于存储值空间(C++11提供了成员初始化,但不适用于前述的数组声明)、

有两种方法可以实现上述目标:

1)在类中声明一个枚举

在类声明中声明的枚举的作用域为整个类,因此可以用枚举为整型常量提供作用域为整个类的符号名称。

class Bakery{

private:

enum {Months = 12};

double costs[Months];

.....

注意:这种方式声明的枚举并不会创建类数据成员。也就是说所有对象中都不包含枚举。

另外,Months只是一个符号名称,在作用域为类的代码中遇到它时,编译器将用12来代替他。

再者,这里使用枚举是为了创建符号常量,并不打算创建枚举类型的变量,因此不需要提供枚举名

2)另一种在类中定义常量的方式-----使用关键字static

class Bakery{

private:

static const int Months = 12;

double costs[Months];

.....

这里将会创建一个名为Months的常量,该常量将会同其他静态变量存储在一起,而不是存储在对象中。因此,只有一个Months常量,被所有的Bakery对象共享。


作用域内枚举

C++11提供了一种新枚举,其枚举量的作用域为类。这种枚举的声明类似于下述类型:

enum class egg{Small, Medium, Large, Jumbo};

enum class t_shirt{Small, Medium, Large, Xlarge};

可以使用关键字struct代替class,无论使用哪种方式,都需要使用枚举名来限定枚举量

egg choice = egg::Large;

t_shirt Floyd = t_shirt::Large;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值