关于对象和类

1、 C++中的类
类是一种将抽象转换为用户定义类型的C++工具。
1.1什么是接口?
接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。例如,要
计算string对象中包含多少个字符,无需打开对象而使用string类提供的size()方法。
方法size()是用户和string对象之间的公共接口的组成部分。通常,方法getline()是istream类的公共接口的组成部分,使用cin的程序不是直接与cin对象内部交互来读取一行输入,而是使用getline()。

1.2访问控制
Class Stock
{
Private:
……
Void set_tot(){ total_val=shares*share_val;} //内联函数

public:

};
类成员可以是数据类型,也可以是函数
关键字private标识 只能通过公共成员访问的类成员(数据隐藏)
关键字public标识 组成类的公共接口的类成员(抽象)

无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。不必在类声明中使用关键字private,因为这是类对象的默认访问控制。

类和结构的之间唯一的区别:
结构的默认访问类型是public,而类为private.

1.3内联方法
其定义位于类声明中的函数都将自动成为内联函数,因此Stock::set_tot()是一个内联函数。
如果愿意,也可以在类声明之外定义成员函数,并使之成为内联函数。使用inline限定符即可,例如:
inline void Stock::set_tot() //inline关键字
{
……
}

1.4方法使用哪个对象
使用成员函数,它将使用被用来调用它的对象的数据成员。
重点:

  1. 所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员。
  2. 但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本,也就是说它们将执行同一个代码块,只是将这些代码用于不同的数据。

1.5使用类
C++的目标是使得使用类与使用基本的内置类型(如int和char )尽可能相同。
要创建类对象:

A a;
A *a=new A;

  1. 可以声明类变量
  2. 可以使用new为类对象分配内存存储空间
  3. 可以将对象作为函数的参数和返回值
  4. 可以将一个对象赋给另一个对象

2、 类的构造函数与析构函数
在类中不能像普通初始化一样,因为数据访问权限是私有的。
C++提供了一个特殊的成员函数——类构造函数,专门用于构造新对象、将值赋给它们的数据成员。
程序声明对象时,将自动调用构造函数。

2.1使用构造函数
第一种是显示地调用:
Stock food=Stock{“World Cabbage”,250,1.25};
另一种是隐式地调用:
Stock garment{“World Cabbage”,250,1.25};

每次创建类对象(甚至使用new动态分配内存)时,将构造函数与new一起使用的方法:
Stock *pstock=new Stock(“World Cabbage”,250,1.25);

构造函数被用来创建对象,而不能通过对象来调用。

2.2默认构造函数
当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数;
为类定义了构造函数后,程序员就必须为它提供默认构造函数,否则编译器报错!!!

2.3析构函数
用构造函数创建对象后,程序负责跟踪该对象,直到其过期为止。
对象过期时,程序将自动调用析构函数,完成清理工作。
例如:如果构造函数使用new来分配内存,则析构函数将使用delete来释放内存。

什么时候应调用析构函数?这是由编译器决定,通常不应在代码中显示地调用析构函数。

  1. 如果创建的是静态存储类对象,则其析构函数将在程序结束时自动调用;
  2. 如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时自动被调用;
  3. 如果对象是通过new创建的,则它将驻留在栈内存或自由存储去区中,当使用delete来释放内存时,其析构函数将自动被调用;
  4. 程序可以创建临时对象来完成特定的操作,程序将在结束对该对象的使用时自动调用其析构函数。

2.4 const成员函数 Void show() const;
请看:
const Stock land=Stock(“Kludgehorn Properties”);
land.show(); //invalid
编译器将拒绝第二行,因为show代码无法确保调用对象不被修改,
因此为保证函数不会修改调用对象,C++的解决方法是将const关键字放在函数的括号后面,即:
Void show() const; //这样写land.show()就不会出错!!!
只要类方法不修改调用对象,就应将其声明为const

3、 this指针

例如:
Const Stock& topval(const Stock& s) const;
该函数隐式地访问一个对象,而显式地访问另一个对象,并返回其中一个对象的引用。
例如:
Top=stock1.topval(stock2);
该格式隐式地访问stock1,而显式地访问stock2

stock& stock::topval(stock& s)
{
If(s.total_val > total_val)
return s;
else
return *this;
}
如果调用stock1.topval(stock2),则s是stock2的引用(即stock2的别名),【引用意味着返回的是调用对象本身,而不是其副本。】
但是stock1没有别名。
解决方法:this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法),这里this设置为stock1对象的地址 *this表示该对象。

4、 类作用域::
类作用域意味着不能从外部直接访问类的成员,公有函数也是如此。也就是说,要调用公有成员函数,必须通过对象。

在类中定义常量的方法—关键字static
Class A
{
Private:
static cons tint Months=12;
}
这将创建一个名为Months的常量,该常量将与其他静态变量存储在一起,而不是存储在对象中。因此,只有一个Months常量,被所有A对象共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值