C++对象和类

类的基础

1.cpp中对象默认访问权限都是private的

2.私有成员只能通过公有函数访问使用

3.类方法名称需包含类名,为函数的限定名

在头文件中定义类,同时将公有方法原型声明(类似Java接口道理).

#ifndef STOCK00_H_
#define STOCK00_H_
#include<string>//股票类
class Stock {//私有部分
private://枚举类enum class egg_old:int{Small, MediummLarge, Jumbo};//公司名std::string company;//股票数量long shares;//单股价格double share_val;//股票总价double total_val;//计算总价void set_tot() { total_val = shares * share_val; }//公共部分
public://无参构造Stock();//有参构造Stock(const std::string& co, long n = 0, double pr = 0.0);//获得用户持有股票信息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);//比较大小const Stock& topval(const Stock& s) const;//查看void show() const;const Stock copyNew();};
#endif // !STOCK00_H_

在同名源文件中实现公有函数定义.

#include<iostream>
#include"stock00.h"//创建成员函数,成员函数可以直接访问类中私有部分成员
//默认构造器,如果没有编译器会自动实现
Stock::Stock() {}//有参构造器
Stock::Stock(const std::string& co, long n, double pr) {company = co;if (0 > n) {std::cerr << "Number of shares can't be negatvie; "<< company << "shares set to 0.\n";shares = 0;}elseshares = n;share_val = pr;set_tot();}/*
co 公司名称
n 股票数量
pr 单股价格
*/
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;}elseshares = n;share_val = pr;set_tot();
}/*
买入股票
num 买入数量
price 单股价格*/
void Stock::buy(long num, double price) {//购买数量小于0,则提示错误信息if (0 > num) {std::cout << "Number of shares purchased cant't negative;"<< "Transaction is aborted.\n";}else {shares += num;share_val = price;set_tot();}}//卖出
void Stock::sell(long num, double price) {if (0 > num) {std::cout << "Number of shares purchased cant't negative;"<< "Transaction is aborted.\n";}else if (num > shares) {std::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() const {std::cout << "Company: " << company<< " Shares: " << shares << '\n'<< " Share Price: $" << share_val<< " Total Worth: $" << total_val << '\n';}const Stock& Stock::topval(const Stock& s) const {if (s.total_val > total_val)return s;return *this;}//当返回对象时,会直接创建新对象返回
const Stock Stock::copyNew() {return *this;
}

在其他源文件中使用类和类方法.

#include<iostream>
#include"stock00.h"
int main() {//声明一个类对象Stock fluffy_the_cat;fluffy_the_cat.acquire("NanoSmart", 20, 12.50);fluffy_the_cat.show();fluffy_the_cat.buy(15, 18.126);fluffy_the_cat.show();fluffy_the_cat.sell(400, 23.32);fluffy_the_cat.show();fluffy_the_cat.buy(300000, 40.125);fluffy_the_cat.show();fluffy_the_cat.sell(300000, 0.23);fluffy_the_cat.show();Stock myFluffy_1 = fluffy_the_cat.copyNew();Stock myFluffy_2 = fluffy_the_cat.copyNew();std::cout << "Fluffy one address is: " << &myFluffy_1<< "\nFluffy two address is: " << &myFluffy_2 << std::endl;return 0;
}

小细节:

1.如果是短小的成员函数,将被作为内联函数。

2.两个不同的对象,类成员和变量都是自己的,但是共享同一组类方法。

3.如果拥有有参构造器,必须声明无参构造器原型,通常应提供对类成员隐式初始化的默认构造函数。

4.不使用new创建的对象都在栈中,生命周期为其作用域,而new创建的则会分配在堆中,需要通过delete删除。

5.析构函数用来在销毁对象后的清理工作,声明为~Stock();

6.默认情况,将对象赋值给同类型的另一个对象,会将每个数据成员内容复制到目标对象中。

Stock stock1;//这会创建一个类对象,用默认构造器初始化它

stock1 = Stock("Tom",21,400);//这会创建一个临时对象,然后将其中的内容复制到stock1中

Stock* stock2 = new Stock;

Stock stock3 = {"Jim",22,3000}; 

7.当成员函数没有参数,无法确保调用对象不被修改时,应该这样声明函数:

void show() const;

void Stock::show() const{

//statments

}

该例子中,show中隐式的使用了类中的成员变量,所以需要显示的声明const。

8. 返回类型如果是对象则是返回其副本,而如果返回引用则是返回该对象。

对象数组

当程序创建未被显示初始化的类对象时,总是调用默认构造函数。

Stock mystuff[4]; //这里都会调用Stock() 默认构造器.

 也可以使用构造函数进行批量的初始化

Stock stocks[10] = {

Stock("A",12.2,10),

Stock("B",32.1,20),

Stock("C",43.1,34),

Stock();

}

首先会创建默认构造函数,然后将花括号中的构造函数创建临时对象,然后将临时对象的内容复制到相应元素中,上面语句前三条将使用有参函数初始化,其余的都调用默认构造器初始化. 

类作用域 

定义成员函数的时候必须使用作用域解析运算符(::),使用类成员名时,需根据上下文使用直接运算符(.),间接成员运算符(->),或作用域解析运算符(::)。

如果类作用域中需定义常量,需要使用枚举类或者静态关键字来创建.

在对象未创建前,并没有实际的内存空间来创建常量。

static

private:

        static const int Months = 12;

        double costs[Months];

//通过静态关键字修饰变量,声明一个静态的常量值 

该常量将与其静态变量存储在一起。

作用域内枚举

使用作用域内枚举类来实现静态变量:

class MyClassTest{

private:

        enum class egg_c:short{Small,Medium,Large};

}

//类函数中使用

int kg = egg_c::Small;

//外部调用枚举

int kkg = Stock::egg_c::Small;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—485.最大连续1的个数【中等】明天修改

2023每日刷题&#xff08;十五&#xff09; Leetcode—2.两数相加 迭代法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l…

Python使用got库如何写一个爬虫代码?

got库是一个Python的HTTP库&#xff0c;可以用于爬取网页数据。它提供了简单易用的API&#xff0c;支持异步请求和爬虫IP设置等功能。使用got库进行爬虫开发&#xff0c;可以快速地获取所需数据。下面是使用got库进行爬虫的基本步骤&#xff1a; 1、安装got库&#xff1a;可以使…

LeetCode454. 4Sum II

文章目录 一、题目二、题解 一、题目 Given four integer arrays nums1, nums2, nums3, and nums4 all of length n, return the number of tuples (i, j, k, l) such that: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 Example 1: Input: nums1 …

sort函数用法

1、基本数据类型数组的排序 若比较函数不填&#xff0c;默认升序排序。 #include <stdio.h> #include <algorithm> using namespace std; int main() { int a[5] {3,5,2,1,4}; sort(a,a5); for(int i0;i<5;i) { printf("%d",a[i]); } r…

PTA 秀恩爱分得快(树)

题目 古人云&#xff1a;秀恩爱&#xff0c;分得快。 互联网上每天都有大量人发布大量照片&#xff0c;我们通过分析这些照片&#xff0c;可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人&#xff0c;这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在…

ruoyi框架前端修改message消失时间

修改教程 打开modal.js文件&#xff0c;找到Message.success&#xff0c;然后把参数设置进去就行。单位是10001秒。 // 可以设置的参数如下export interface ElMessageOptions {/** Message text */message: string | VNode/** Message type */type?: MessageType/** Custom …

4.5 Object类

思维导图&#xff1a; 4.5 Object类笔记总结 1. 定义和重要性 Java提供的Object类是所有Java类的根类。直接或间接&#xff0c;所有的Java类都继承自Object类。它被称为超类。 2. 默认行为 当创建一个新的类且没有显式地使用extends关键字指定一个父类时&#xff0c;该类默认…

Microsoft Edge不能工作了,可能原因不少,那么如何修复呢

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

金蝶云星空自定义校验器和使用

文章目录 金蝶云星空自定义校验器和使用 金蝶云星空自定义校验器和使用 1、创建类&#xff0c;并继承抽象接口 using Kingdee.BOS.Core; using Kingdee.BOS.Core.Validation; using System;namespace mm.K3.SCM.App.Service.PlugIn.SC.Validator {public class AfterOrderChe…

跨境电商大作战:2023黑色星期五准备指南

黑色星期五&#xff0c;作为全球购物狂欢的象征&#xff0c;已经成为了电商业务的一年一度的重要节点。尤其对于跨境电商来说&#xff0c;这一天意味着巨大的商机和挑战。为了在这个竞争激烈的时刻脱颖而出&#xff0c;跨境电商必须做好充分的准备。Nox聚星在这里给大家分享几个…

最新ai系统ChatGPT程序源码+详细搭建教程+以图生图+Dall-E2绘画+支持GPT4+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

Q-CTRL首次在量子市场获得ISO 27001国际标准认证

​&#xff08;图片来源&#xff1a;网络&#xff09; 国际公认的ISO 27001标准概述了信息安全管理系统&#xff08;ISMS&#xff09;的实施&#xff0c;并表现了管理风险的能力&#xff0c;包括与客户数据安全相关的风险。总部位于悉尼的Q-CTRL是第一家获得ISO 27001认证的独…

Vue 3 中的 Composition API

✨理解 Vue 3 中的 Composition API &#x1f383; Vue 3 引入了全新的 Composition API&#xff0c;相较于传统的 Options API&#xff0c;它具备许多优势和适用场景。下面将介绍 Composition API 的优势和使用场景&#xff0c;并为你带来更好的开发体验。 &#x1f381; Co…

Linux 启用本地ISO作为软件源

环境&#xff1a;sle12sp5 &#xff08;open SUSE&#xff09; 1、禁用现有的源 查看源&#xff1a;sle12sp5 zypper lr -u ➜ sle12sp5 zypper lr -u Repository priorities are without effect. All enabled repositories share the same prior…

学生成绩这样分发

作为一名老师&#xff0c;经常被问到这样的问题&#xff1a;“老师&#xff0c;我的成绩什么时候发&#xff1f;”、“老师&#xff0c;我的成绩出来了吗&#xff1f;”等等。倍感烦恼&#xff0c;需要花费时间来回答这些问题&#xff0c;而且有时候学生还会因为成绩不佳而抱怨…

C++对象的内存分布和虚函数表

Linux C/C 开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全) c中一个类中无非有四种成员&#xff1a;静态数据成员和非静态数据成员&#xff0c;静态函数和非静态函数。 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。 2.静态数据成员被提取出来…

电力兆瓦-小记

电力产能的换算单位通常使用以下方式&#xff1a; 1 兆瓦&#xff08;MW&#xff09;等于 1,000 千瓦&#xff08;kW&#xff09;。 1 千瓦&#xff08;kW&#xff09;等于 1,000 瓦特&#xff08;W&#xff09;。 1 兆瓦&#xff08;MW&#xff09;等于 1,000,000 瓦特&#…

OpenSSL生成CA证书

基本概念 证书类别 根证书&#xff1a;生成服务端证书&#xff0c;客户端证书的基础。自签名。服务端证书&#xff1a;由根证书签发。配置在服务器上。客户端证书&#xff1a;由根证书签发。配置在浏览器、移动APP等客户端上。 认证方式 单向认证&#xff08;Client鉴权Serv…

ONES插件开发的学习笔记

首先插件的功能是私有化部署的功能, 只能在私有化部署的 ONES 上能安装和使用插件。 安装最新版本 Node.js 的稳定版, 配置 ONES 的私有 npm 仓库&#xff1a; $ npm config set registryhttps://registry.npmjs.org/ $ npm config set ones:registryhttps://npm.partner.one…

docker安装软件

docker安装redis及其配置 docker安装redis及其配置 安装镜像 查询镜像 docker search redis拉取镜像 docker pull redis:7.2.2创建文件目录 创建目录 mkdir /home/redis/conf mkdir /home/redis/data创建配置文件 cd /home/redis/conf touch redis.conf以下链接中下载相…