C++基础04-类基础

 一、类和对象

面向对象三大特点:封装、继承、多态。

struct 中所有行为和属性都是 public (默认)。C++中的 class 可以指定行为和属性的访问方式。

封装,可以达到,对内开放数据,对外屏蔽数据,对外提供接口。达到了信息隐蔽的功能。

class 封装的本质,在于将数据和行为,绑定在一起然后能过对象来完成操作 

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>using namespace std;struct Hero
{char name[64];int sex;
};void printHero(struct Hero &h)
{cout << "Hero" << endl;cout << "name = " << h.name << endl;cout << "sex = " << h.sex << endl;
}class AdvHero
{
public://访问控制权限char name[64];int sex;void printHero(){cout << "advHero" << endl;cout << "name = " << name << endl;cout << "sex = " << sex << endl;}
};void test01() {Hero h;strcpy(h.name, "gailun");h.sex = 1;printHero(h);AdvHero advH;strcpy(advH.name, "ChunBro");advH.sex = 1;advH.printHero();
}class Animal
{//{}以内 叫类的内部, 以外叫类的外部
public:char kind[64];char color[64];//在public下面定义成员变量和函数 是能够在类的内部和外部都可以访问的。void printAnimal(){cout << "kind = " << kind << endl;cout << "color = " << color << endl;}void write(){cout << kind << "开始鞋子了" << endl;}void run(){cout << kind << "跑起来了" << endl;}//
private://在private下面定义的成员变量和方法只能够在类的内部访问};
void test02() {Animal dog;strcpy(dog.kind, "dog");strcpy(dog.color, "yellow");Animal sheep;strcpy(sheep.kind, "sheep");strcpy(sheep.color, "white");dog.write();sheep.run();
}
int main(void)
{test01();cout << "-----------" << endl;test02();return 0;
}
#endif

二、类的封装

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>//struct 
using namespace std;
struct Date
{int year;int month;int day;
};void init_date(struct Date & d)
{cout << "year, month, day" << endl;cin >> d.year;cin >> d.month;cin >> d.day;
}//打印data的接口
void print_date(struct Date &d)
{cout << d.year << "年" << d.month << "月" << d.day << "日" << endl;
}//是不是闰年
bool is_leap_year(struct Date &d)
{if (((d.year % 4 == 0) && (d.year % 100 != 0)) || (d.year % 400 == 0)) {return true;}return false;
}
void test01() {Date d1;init_date(d1);print_date(d1);if (is_leap_year(d1) == true) {cout << "是闰年 " << endl;}else {cout << "不是闰年 " << endl;}
}//类
class MyDate
{
public://成员方法 成员函数void init_date(){cout << "year, month, day" << endl;cin >> year;cin >> month;cin >> day;}//打印data的接口void print_date(){cout << year << "年" << month << "月" << day << "日" << endl;}bool is_leap_year(){if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {return true;}return false;}int get_year(){return year;}void set_year(int new_year){year = new_year;}protected://保护控制权限。在单个类中,跟private是一抹一样。//在类的继承中跟private有区别,
private:int year;int month;int day;
};void test02(){MyDate my_date;my_date.init_date();my_date.print_date();if (my_date.is_leap_year() == true){cout << "是闰年 " << endl;}else {cout << "不是闰年 " << endl;}//getter,settercout << my_date.get_year() << endl;my_date.set_year(2000);cout << my_date.get_year() << endl;
}//一个类类的内部,默认的访问控制权限是private
class Hero
{int year;
};//一个结构体默认的访问控制权限的是public
struct Hero2
{int year;void print(){}
};void test03() {Hero h;//h.year = 1000;  报错Hero2 h2;h2.year = 100;
}
int main(void)
{//test01();test02();test03();return 0;
}
#endif

三、面向过程和面向对象

#if 0
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;class Dog
{
public:void eat(char *food){cout << name << "吃" << food << endl;}char name[64];
};//面向过程
void eat(class Dog &dog, char *food)
{cout << dog.name << "吃" << food << endl;
}int main(void)
{Dog dog;strcpy(dog.name, "狗");//过程驱动eat(dog, "翔");//对象驱动dog.eat("翔");return 0;
}
#endif

练习:

#if 1
#define _CRT_SECURE_NO_WARNINGS
#define PI 3.14
#include <iostream>
using namespace std;//面向过程
double get_l(double r) {return 2 * PI*r;
}
double get_s(double r) {return PI*r*r;
}
void test01() {cout << "面向过程" << endl;double r = 2;cout << "周长为:" << get_l(r) << endl;cout << "面积为:" << get_s(r) << endl;
}//面向对象
class Circle {
public:Circle() {}Circle(double r) :m_r(r) {}void setR(double r) {m_r = r;}double get_l() {return 2 * PI*m_r;}double get_s() {return PI*m_r*m_r;}
public:double m_r;   //我 double m_r;
};
void test02() {cout << "面向对象" << endl;Circle c1(2);cout << "周长为:" << c1.get_l() << endl;cout << "面积为:" << c1.get_s() << endl;Circle c2;c2.setR(4);cout << "周长为:" << c2.get_l() << endl;cout << "面积为:" << c2.get_s() << endl;}
class Circle2 {
public:void setR(double r) {m_r = r;}double get_l() {return m_l;}double get_s() {return m_s;}
private:double m_r;double m_l= 2 * PI*m_r;  //其实为2*3.14*随机数 错误double m_s= PI*m_r*m_r;  //其实为3.14*随机数*随机数 错误
};
void test03() {Circle2 c1;c1.setR(10);cout << c1.get_l() << endl;  //-5.81274e+62cout << c1.get_s() << endl;  //2.69013e+124
}
class Circle3 {
public:void setR(double r) {m_r = r;}double get_l() {return 2 * PI*m_r;}double get_s() {return PI*m_r*m_r;}
private:double m_r;double m_l ;  //其实为2*3.14*随机数 错误double m_s ;  //其实为3.14*随机数*随机数 错误
};
void test04() {Circle3 c1;c1.setR(10);cout << c1.get_l() << endl;  //62.8cout << c1.get_s() << endl;  //314
}
int main() {test01();test02();cout << "-------------" << endl;test03();cout << "-------------" << endl;test04();return 0;
}
#endif
//	demo02_circle_err.cpp
#include<iostream>
using namespace	std;//c++的命名空间
class	circle	
{	
public:	
double	r;	
double	pi	=	3.1415926;	
double	area	=	pi*r*r;	
};	
int	main(void)	
{	circle	pi;	cout<<"请输⼊area"<<	endl;	cin	>>pi.r;	cout<<pi.area<<endl;				//乱码
return 0;	
}	

运行结果: 

#include "iostream"
#define PI 3.1415926
using namespace std;
class Cricle {
public:double m_r;double m_s;
public:void setR(double r) {m_r = r;}double getR(){return m_r;}double getS(){m_s = m_r*m_r*PI;return m_s;}
};
int main()
{double r1;Cricle c1;cout << "请输入圆的半径" << endl;cin >> r1;c1.setR(r1);cout << "圆的面积为:" << c1.getS() << endl;return 0;
}

运行结果:

不难发现有成员函数和没有成员函数答案是不一样的,为什么没有成员函数的答案会是一个乱码?

画个图来理解一下。

 

当给r赋值并不会影响area的值,因为当实例化类对象时,就已经为类对象的数据成员分配了空间。给r赋值,并不会影响area中初始化时的r的随机值。相互独立。

所以没有成员函数和有成员函数的相差很大。

参考自https://blog.csdn.net/sum_TW/article/details/52108421

 

 

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

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

相关文章

C++基础05-类构造函数与析构函数

总结&#xff1a; 1、类对象的作用域为两个{}之间。在遇到}后开始执行析构函数 2、当没有任何显式的构造函数&#xff08;无参&#xff0c;有参&#xff0c;拷贝构造&#xff09;时&#xff0c;默认构造函数才会发挥作用 一旦提供显式的构造函数&#xff0c;默认构造函数不复…

PHP网站配置项,Thinkphp5通用网站后台配置项的动态添加及更新

一、引入无论平时我们自己制作&#xff0c;还是浏览别人的网站&#xff0c;它都具有其相应的一些共用的、通用的属性&#xff0c;比如&#xff1a;网站的名字&#xff0c;关键字、备案号、分页数量、是否开启缓存等信息。一些网站可能将配置项写死在后台&#xff0c;无法动态更…

oracle 查询cpu 100%,Oracle 11g中查询CPU占有率高的SQL

oracle版本&#xff1a;oracle11g背景&#xff1a;今天在Linux中的oracle服务上&#xff0c;运用top命令发现许多进程的CPU占有率是100%。操作步骤&#xff1a;以进程PID:7851为例执行以下语句&#xff1a;方法一&#xff1a;(1)通过PID&#xff0c;查得相对应的系统进程对应的…

C++基础08-this指针-const修饰成员函数-函数返回引用/值

一、this指针 1、C类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效&#xff01; 2、C中类的普通成员函数都隐式包含一个指向当前对象的this指针。 3、静态成员函数、成员变量属于类 4、静态成员函数与普通成员函数的区别 静态成员函数不包含指…

C++基础09-货物售卖和MyArray实现

1、货物出货与进货 #if 0 #include<iostream> using namespace std; /* 某商店经销一种货物。货物购进和卖出时以箱为单位。各箱 的重量不一样&#xff0c;因此商店需要记录目前库存的总重量&#xff0c;现在用 C模拟商店货物购进和卖出的情况 */ class Goods { public:…

C++基础11-类和对象之操作符重载1

总结&#xff1a; 1、运算符重载的本质是函数重载 2、运算符重载可分为成员函数重载和全局函数重载(差一个参数) 3、运算符重载函数的参数至少有一个是类对象&#xff08;或类对象的引用&#xff09; 4、不可以被重载的操作符有&#xff1a;成员选择符(.) 成员对象选择符(.*) …

linux照片备份软件,Linux、Unix上5个惊艳开源备份软件

Linux和类Unix系统上5个惊艳的开源备份软件&#xff1a;Bacula、Amanda、Backupninja、Backuppc和UrBackup&#xff0c;这些都是既可以使用在Linux上也可以使用在Unix上面&#xff0c;他们的优点就是性能稳定&#xff0c;使用灵活。一个好的备份计划是非常必要的&#xff0c;这…

linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向

Linux系统中Nginx的安装并进行域名认证和重定向本文主要介绍Linux系统中Nginx的安装并进行域名认证和重定向&#xff0c;希望通过本知识点的讲解对大家今后的学习和工作有所帮助&#xff0c;下面进行具体介绍&#xff1a;12.6 Nginx安装cd /usr/local/srcwget http://nginx.org…

linux有读EC RAM的工具吗,Step to UEFI (179)Shell下 EC Ram 读取工具

最近工作需要在 UEFI Shell 下Check EC Ram 的设定&#xff0c;发现手上只有 Windows 下的读取工具(RW Everything)。于是研究了一下如何在Shell 读取 EC Ram。根据【参考1】读取的流程如下&#xff1a;Port 66 CommandsThere are also some EC commands that use ports 0x66 …

C++基础13-类和对象之继承1

在 C中可重用性(software reusability)是通过继承(inheritance)这一机制来实现的。 如果没有掌握继承性,就没有掌握类与对象的精华。 总结&#xff1a; 1、只要是父类中的private成员&#xff0c;不管是什么继承方式&#xff0c;儿子都访问不了&#xff0c;但它是存在在儿子之…

C++基础13-类和对象之继承2

总结&#xff1a; 1、子类对象可以当做父类对象使用 2、子类对象可以直接赋值给父类对象 3、子类对象能够直接初始化父类对象 4、父类指针可以直接指向子类对象 5、凡是继承过来的属性和函数都可以在子类中用this-> 进行访问 6、默认构造函数并不会初始化数据成员 7、如果…

C++基础14-类和对象之多继承与虚继承

多继承&#xff1a;一个类有多个直接基类的继承关系称为多继承 总结&#xff1a; 1、一般将具有菱形样式继承方式的某些类声明为虚继承 3、虚继承的主要目的是为了防止二义性 2、虚继承就是在继承方式前加virtual 如果一个派生类从多个基类派生&#xff0c;而这些基类又有一…

linux系统安装ntp,CentOS下NTP安装配置

安装yum install ntp配置文件 /etc/ntp.confrestrict default kod nomodifynotrap nopeer noqueryrestrict -6 default kod nomodify notrap nopeer noqueryrestrict 127.0.0.1restrict -6 ::1# 用restrict控管权限# nomodify - 用户端不能更改ntp服务器的时间参数# noquery - …

C++基础15-类和对象之多态

总结&#xff1a; 1、在父类中申明虚函数时&#xff0c;一般情况下在子类中也申明&#xff08;便于读代码&#xff09; 一、赋值兼容 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。 赋值兼容是一种默认行为,不需要任何的显示的转化步骤。 …

傲云浏览器linux,Centos7安装部署zabbix监控软件

目录部署监控服务器部署监控服务器Zabbix ServerWeb页面验证设置部署监控服务器一、安装LNMP环境Zabbix监控管理控制台需要通过Web页面展示出来&#xff0c;并且还需要使用MySQL来存储数据&#xff0c;因此需要先为Zabbix准备基础LNMP环境。1. wget下载官网Nginxwget http://ng…

c语言环境变量的作用,C语言获取系统环境变量

C语言获取系统环境变量可以通过如下代码实现.#include #include char *platform(){//获取系统变量信息char *ret;extern char **environ;char **env environ;//打印系统变量信息/*while(*env){//puts(*env);env;}*/ret getenv("OS"); //for windows_ntif(NULL ! re…

mysql索引创建及使用注意事项

总结&#xff1a; 1、在使用索引时&#xff0c;一般情况下不建议使用like操作。如果使用&#xff0c;则%放在后面。否则不会使用索引。like ‘%abd%’不会使用索引,而like ‘aaa%’可以使用索引.&#xff08;最左缀原则&#xff09; 2、单列索引的使用&#xff1a; 《1》 只…

mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...

[闽南网]和平精英公测开启&#xff0c;和平精英与刺激战场有什么不同呢&#xff1f;今天小编就为大家带来了信号值详解&#xff01;各位玩家千万不要错过呀&#xff01;信号值详解信号接收区和信号值是什么&#xff0c;对选手有什么影响&#xff1f;在游戏战斗界面中&#xff0…

制备pdms膜的方法_船体用钢板基底超疏水表面的制备和性能

鲨鱼皮具有神奇的微纳双层结构&#xff0c;其微米级肋条状结构在水中的整流效果可减小水的阻力。纳米级刺状突起或刚毛具有疏水特性&#xff0c;使植物抱子很难附着其上&#xff0c;海藻等植物也不能在其表面生长&#xff3b;1,2&#xff3d;。这种微纳结构及其疏水性的共同作用…

递归题型解析

#include<iostream> using namespace std; int foo(int n) {if (n < 1)return n;return (foo(n - 1) foo(n - 2)); } int main() {printf("%d\n", foo(5));return 0; } 解析&#xff1a; foo(5)foo(4)f00(3)foo(3)foo(2)foo(3)2foo(3)foo(2)2(foo(2)foo(1…