C++类

:: 是作用域解析运算符
{
定义类的成员函数时,使用 :: 来标识函数所属的类。
如:void Stock::update(double price)
1.表示update()是Stock类的成员,不仅可以将update()标识为成员函数,还可以在另外一个类中定义一个同样的update()函数。
2.Stock类的其他成员函数可以不使用::就可以访问update()方法,因为他们同属于一个类。
}

内联函数p348

关于类的内存:
kate和joe都是Stock类的对象 有自己的空间,该空间用于存储其内部成员变量和类变量,但函数不一样,kate.show()和joe.show()调用同一个方法,他们执行同一个代码块,只是这些代码用于不同的数据,在OOP中,调用一个成员函数被称为发送消息,就是把一个同样的消息(被调用的成员函数)发送给不同的对象

类的典型声明格式:
class className{
private:
data member declarations //数据成员
public:
member function prototypes //成员函数

}
使用::后定义了类的成员函数后,只有在特定情况下才可使用缩写,如类方法的代码中
全名是Stock::update(),缩写是update().

10.3 类的构造函数和析构函数
Stock::Stock(const string & co,long n,double pr){

}

关于成员名和参数名
Stock::Stock(const string & company,long shares,double share_val){

}
是不允许的,即成员名和参数名不能重名,否则:
shares=shares的赋值会出现错误
通常会在类的成员变量中加m_前缀或后缀_
eg.
class Stock{
pirvate:
string m_company; //类似于java中的 this.company
//或者
long shares_;
}

使用构造函数(constructor)
Stock food = Stock(…);
或者使用new来动态分配内存:
Stock food = new Stock(…);

析构函数(destructor):
析构函数的作用:当对象过期后,析构函数负责完成清理工作,例如
构造函数使用了new来分配内存,则析构函数用delete来释放这些内存,若stock的构造函数没有使用new,则析构函数没有需要完成的任务,在这种情况下,只需让编译器生成一个什么都不用做的隐式析构函数即可。
析构函数的名称:在类名前加上~
如,Stock类的析构函数是~Stock(),
析构函数没有返回值和声明类型,并且没有参数类型

关于何时调用析构函数:
1.通常不需要显示调用析构函数(除去new)
2.创建静态存储类对象,析构函数将在程序结束时自动被调用
3.创建的时自动存储类 (?),将在程序执行完代码块时(该对象是在其中被定义的)自动被调用
4.使用new,它将驻留在栈内存或自由存储区,需要使用delete来释放内存,此时析构函数被调用
5.如创建的是临时对象 (?),将在该对象结束时自动调用析构函数

改进的Stock类
class Stock{
private:

public:
//two constructors
Stock();
Stock(…);
~Stock(); //noisy destructor

}

cpp文件中完成函数的定义
Stock::~Stock(){
cout<<“Bye”<<endl;
}

stock2=stock1 //这样做会导致原本存储在stock2里的数据丢失,成为垃圾数据

const成员函数
若类方法不修改调用对象,就应当声明为const,将const关键字放在函数括号后面:
void show() const; //const成员函数
void stock::show() const //方法实现的开头保持一致

8.5函数模板
由于类型是用参数表示的,所有模板特性有时又被称为参数化类型

函数模板的声明只是告诉了编译器如何定义函数,而不创建任何函数

templete <typename T> //or templete <class T> 此处无;
void Swap(T &a,T &b);

#include <iostream>
template <typename T> //告诉编译器泛型的名字是T
void Swap(T& a, T& b);  //声明一个Swap函数

int main() {
using namespace std;
//省略主程序
 return 0;
 }
 
//定义模板化函数
template <typename T>
void Swap(T& a, T& b) {
 T temp;
 temp = a;
 a = b;
 b = temp;
}

更常见的方式是将模板放在头文件中,并在需要使用模板的文件中包含头文件

重载的模板
templete < typename T>
void Swap(T &a, T&b);

//使用数组的模板函数声明(要使用指针)
templete < typename T>
void Swap(T *a,T *b,int n );

//使用数组的模板函数定义
templete < typename T>
void Swap(T a[],T b[],int n ){
T temp;
for(int I=0;i<n;i++){
temp=a[i];
a[i]=b[i];
b[i]=temp;
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值