对象和类,公有类和私有类,构造函数和析构函数,const成员函数,this指针,对象数组,类作用域,抽象数据
2017-03-06 08:52
666 查看
下面是头文件stock00.h的内容:
接下来的file1是函数的定义:
定义位于类声明中的函数都将自动成为内联函数。
类所创建的每个对象都有自己的存储空间,用于存储内部变量和类成员,但同一个类的所有对象共享一组类方法(即 函数)。
接下来的file3是对函数的调用:
#include<iostream>
#include"stock00.h"
int main()
{
Stock fluffy_the_cat;
fluffy_the_cat.acquire("NanoSmart", 20, 12.15);
fluffy_the_cat.show();
fluffy_the_cat.buy(15, 18.125);
fluffy_the_cat.show();
fluffy_the_cat.sell(400, 20.00);
fluffy_the_cat.show();
return 0;
}类数据隐藏并不是存储该数据的内存不可访问,而是你不知道存储该数据的地址。
类构造函数:由于类的数据是私有的,所以不可以使用普通的列表初始化方法对类对象赋初值,要使用类构造函数。若在类外定义构造函数,则要加上域作用符,例:
Stock::Stock(const string &co, long n, double pr)
{
company = co;
if (n < 0)
{
std::cerr << "Number of shares can't be negative;"
<< company << " shares set to 0.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}比较简单的构造函数也可以使用参数初始化表的方式来构造,例如:Stock(int h,int n):height(h), no(n){}
使用构造函数的方法有2种:1。显式调用:Stock food=Stock("World cabbage",250,1.25); 2.隐式调用:Stock garment("Furry Marson",50,2.5);
在没有构造函数的情况下,C++将调用默认的构造函数。
析构函数:在对象过期时会调用析构函数,Stock::~Stock(); 该函数没有参数。
#include<iostream>
using namespace std;
int main()
{
{
Stock hello;//假设析构函数已被认为定义,作用是输出end单词
hello.show();
}
return 0;
}如上如果main()函数中没有多一个大括号,则对象将先执行return0,再消失,也就看不懂end单词了,有括号的话,对象将在退出其定义所属的代码块时消失,调用析构函数,就可以看到end单词了。
同类对象可以用赋值运算符来赋值。
const成员函数:如果对象为const,则函数也必须为const; 但函数为const的话,对象不一定要为const。只要调用的函数不修改数据,就应该在其后面加const,如:void show()const;
this指针:const Stock &Stock::topval(const Stock &s)const//stock1对象和stock2对象在stock1中比较top_val的大小,s为stock2的引用
{
if (s.total_val > total_val)//此处total_val也可以改为this->total_val
return s;
else
return *this;//返回该对象
}this是对象的地址,*this是对象本身。
#ifndef STOCK00_H_ #define STOCK00_H_ #include<string> class Stock { private://私有,不可以被外界直接访问,只能通过公有函数访问 std::string company; long shares; double share_val; double total_val; void set_tot() { total_val = shares*share_val; } public://公有,可以被外界直接访问 void acquire(const std::string&co, long n, double pr); void buy(long num, double price); void sell(long num, double price); void update(double price); void show(); }; #endifprivate是类对象默认访问控制。
接下来的file1是函数的定义:
#include<iostream>//此文件是对头文件中的函数定义 #include"stock00.h" void Stock::acquire(const std::string&co, long n, double pr) { company = co; if (n < 0) { std::cout << "Number of shares can't be negative;" << company << "shares set to 0.\n"; shares = 0; } else shares = n; share_val = pr; set_tot(); } void Stock::buy(long num, double price) { if (num < 0) { std::cout << "Number of shares purchased can't be negative." << "Transaction if aborted.\n"; } else { shares += num; share_val = price; set_tot(); } } void Stock::sell(long num, double price) { using std::cout; if (num < 0) { cout << "Number of shares sold can't be negative." << "Transaction is aborted.\n"; } else if(num>shares) { cout << "You can't sell more than you have!" << "Transaction is aborted.\n"; } else { shares -= num; share_val = price; set_tot(); } } void Stock::update(double price) { share_val = price; set_tot(); } void Stock::show() { std::cout << "Company:" << company << " Shares: " << shares << '\n' << "Share price :$" << share_val << " Total Worth: $" << total_val << std::endl; }
定义位于类声明中的函数都将自动成为内联函数。
类所创建的每个对象都有自己的存储空间,用于存储内部变量和类成员,但同一个类的所有对象共享一组类方法(即 函数)。
接下来的file3是对函数的调用:
#include<iostream>
#include"stock00.h"
int main()
{
Stock fluffy_the_cat;
fluffy_the_cat.acquire("NanoSmart", 20, 12.15);
fluffy_the_cat.show();
fluffy_the_cat.buy(15, 18.125);
fluffy_the_cat.show();
fluffy_the_cat.sell(400, 20.00);
fluffy_the_cat.show();
return 0;
}类数据隐藏并不是存储该数据的内存不可访问,而是你不知道存储该数据的地址。
类构造函数:由于类的数据是私有的,所以不可以使用普通的列表初始化方法对类对象赋初值,要使用类构造函数。若在类外定义构造函数,则要加上域作用符,例:
Stock::Stock(const string &co, long n, double pr)
{
company = co;
if (n < 0)
{
std::cerr << "Number of shares can't be negative;"
<< company << " shares set to 0.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}比较简单的构造函数也可以使用参数初始化表的方式来构造,例如:Stock(int h,int n):height(h), no(n){}
使用构造函数的方法有2种:1。显式调用:Stock food=Stock("World cabbage",250,1.25); 2.隐式调用:Stock garment("Furry Marson",50,2.5);
在没有构造函数的情况下,C++将调用默认的构造函数。
析构函数:在对象过期时会调用析构函数,Stock::~Stock(); 该函数没有参数。
#include<iostream>
using namespace std;
int main()
{
{
Stock hello;//假设析构函数已被认为定义,作用是输出end单词
hello.show();
}
return 0;
}如上如果main()函数中没有多一个大括号,则对象将先执行return0,再消失,也就看不懂end单词了,有括号的话,对象将在退出其定义所属的代码块时消失,调用析构函数,就可以看到end单词了。
同类对象可以用赋值运算符来赋值。
const成员函数:如果对象为const,则函数也必须为const; 但函数为const的话,对象不一定要为const。只要调用的函数不修改数据,就应该在其后面加const,如:void show()const;
this指针:const Stock &Stock::topval(const Stock &s)const//stock1对象和stock2对象在stock1中比较top_val的大小,s为stock2的引用
{
if (s.total_val > total_val)//此处total_val也可以改为this->total_val
return s;
else
return *this;//返回该对象
}this是对象的地址,*this是对象本身。
相关文章推荐
- 计算机程序设计(C++)第10周编程作业数据的抽象和封装——类(2)——构造函数、析构函数和指向对象的指针
- C++学习笔记(六)-- 类和对象 构造函数和析构函数 const成员函数 this指针 对象数组 堆栈管理变量
- 从零开始学C++之类与对象:类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等
- C++构造函数,析构函数,不在main中写任何东西依然有输出的方式,证明this指针的存在,mutable关键字,cin的读取方式,友元函数
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- 类_构造函数_析构函数_函数重载_this指针
- C++ Primer 学习笔记_49_类与数据抽象 -暗含的this指针
- day_05_构造函数_this指针_析构函数
- 关注C++细节——含有本类对象指针的类的构造函数、析构函数、拷贝构造函数、赋值运算符的例子
- 03.C++类、this指针、static静态变量、构造函数、析构函数
- PHP类与对象,构造函数和析构函数,加上this绑定详解
- this指针在普通函数、对象方法、定时器、构造函数、事件函数、call()、apply()中的执行
- 将构造函数,析构函数声明为私有和保护的,那么对象如何创建?
- C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
- c++笔记03---构造函数,初始化表,文件分类,钟表练习,析构函数,this 指针
- 父类构造函数中的this指针在子类构造对象后,这个this指针指向什么
- 读几个小程序了解c++:Part 01(构造函数、析构函数、指针、静态数据成员)
- 将构造函数,析构函数声明为私有和保护的,那么对象如何创建?
- this指针、构造函数、拷贝构造函数、析构函数的总结
- 析构函数和对象数组和对象指针