当前位置: 首页 > news >正文

类和对象C++ (未完:对象特征)

封装

将属性和行为作为一个整体,表现生活中的事物

封装的意义

#include<iostream>
#include<string.h>
using namespace std;
//设计学生类
class student {
public://公共权限/*类中的属性和行为  统一称为成员属性=成员属性=成员变量行为=成员函数=成员方法*///属性string m_Name;//姓名int m_Id;//学号//权限/行为void setName(string name) {m_Name = name;}void setId(int id) {m_Id = id;}void showStudent() {cout << "name=" << m_Name << " id=" << m_Id << endl;}
};
int main() {//创建一个具体的学生——实例化对象student s1;//两种赋值方式//s1.m_Name = "张三";//s1.m_Id = 11;s1.setName("张三");s1.setId(11);s1.showStudent();return 0;
}

访问权限

公共权限 public
保护权限 protected 
私有权限 private   

#include<iostream>
using namespace std;
/*
访问权限
公共权限 public     成员类内可以访问,类外也可以访问
保护权限 protected  类内可以访问,类外不可以访问      儿子可以访问父亲中保护的内容——父亲想让儿子使用的
私有权限 private    类内可以访问,类外不可以访问      儿子不能访问父亲中私有内容——不亲不想让儿子使用的
*/class Person {
public:string m_Name;protected:string m_Car;private:int m_Password;public:void func() {m_Name = "张三";m_Car = "小米汽车";m_Password = 123456;}
};int main() {Person p1;p1.m_Name = "张四";//可以使用p1.func();//可以使用//p1.m_Car   p1.m_Password  不能访问return 0;
}

struct和class的区别

#include<iostream>
using namespace std;
//struct默认权限为公共
//class默认权限为私有class C1 {int m_A;//默认权限是私有
};struct C2 {int m_A;//默认权限是公共
};
int main() {C1 c1;C2 c2;//c1.m_A;  权限是私有,不可以访问c2.m_A;return 0;
}

成员属性设置为私有

1.将所有成员属性设置为私有,可以自己控制读写权限

2.对于写权限,可以检测数据的有效性

#include<iostream>
#include<string.h>
using namespace std;
class Person {//提供公有的方法对私有的属性进行控制
public://设置姓名void setName(string name) {m_Name = name;}//获取姓名string getName() {return m_Name;}//获取年龄int getAge() {return m_Age;}//设置年龄0~150void set_Age(int age) {if (age < 0 || age > 150) {cout << "年龄输入有误,赋值失败" << endl;return;}m_Age = age;}//设置偶像void set_Idol(string idol) {m_Idol = idol;}
private:string m_Name;//可读可写int m_Age = 18;//可读    也可以写(年龄必须在0-150之间)string m_Idol;//可写
};
int main() {Person p;p.setName("张三");cout << "姓名:" << p.getName() << endl;p.set_Age(160);cout << "年龄:" << p.getAge() << endl;p.set_Idol("卢梭");return 0;
}

分别用全局函数和成员函数判断两个立方体是否相等

#include<iostream>
using namespace std;
//1.设计立方体类Cube
//2.求出立方体的面积和体积
//3.分别用全局函数和成员函数判断两个立方体是否相等
class Cube {
public:void setLength(int l) {m_L = l;}int getLength() {return m_L;}void setWeight(int w) {m_W = w;}int getWeight() {return m_W;}void setHeight(int h) {m_H = h;}int getHeight() {return m_H;}//面积int getArea() {return 2 * m_H * m_L + 2 * m_H * m_W + 2 * m_L * m_W;}//体积int getVolume() {return m_H * m_L * m_W;}//利用成员函数判断两个立方体是否相等bool isSameByClass(Cube c1,Cube c2) {if (c1.m_H == c2.m_H && c1.m_L == c2.m_L && c1.m_W == c2.m_W)return true;else return false;}
private:int m_W;//宽int m_L;//长int m_H;//高
};//利用全局函数判断
bool isSame(Cube &c1, Cube &c2) {if (c1.getLength() == c2.getLength() && c1.getHeight() == c2.getHeight() && c1.getWeight() == c2.getWeight())return true;else return false;
}int main() {Cube c1;c1.setLength(10);c1.setWeight(10);c1.setHeight(10);cout << c1.getArea() << endl;cout << c1.getVolume() << endl;Cube c2;c2.setLength(10);c2.setWeight(10);c2.setHeight(10);//bool ret = isSame(c1, c2);bool ret = c1.isSameByClass(c1,c2);if (ret) cout << "c1=c2" << endl;else cout << "c1!=c2" << endl;return 0;
}

判断点和圆的位置关系

//circle.h
#pragma once
#include<iostream>
#include "point.h"
using namespace std;class Circle {
private:int c_R;//半径Point c_Center;//圆心public:void setCenter(Point center);//获取圆心Point getCenter();void setR(int r);int getR();
};//point.h
#pragma once
#include<iostream>
using namespace std;class Point {
private:int p_X;int p_Y;public:void setX(int x);int getX();void setY(int y);int getY();
};circle.cpp
#include "circle.h"
void Circle::setCenter(Point center) {c_Center = center;
}
//获取圆心
Point Circle::getCenter() {return c_Center;
}
void Circle::setR(int r) {c_R = r;
}
int Circle::getR() {return c_R;
}//Circle::  是加上作用域//point.cpp
#include "point.h"void Point::setX(int x) {p_X = x;
}
int Point::getX() {return p_X;
}
void Point::setY(int y) {p_Y = y;
}
int Point::getY() {return p_Y;
}//main
#include<math.h>
#include<iostream>
using namespace std;
#include "point.h"
#include "circle.h"//判断点和圆的关系
void isInCircle(Circle &c,Point &p) {int t;t=pow(c.getCenter().getX() - p.getX(), 2) + pow(c.getCenter().getY() - p.getY(), 2);int r = c.getR();if(t < r*r)cout << "点在圆内" << endl;else if (t == r*r)cout << "点在圆上" << endl;elsecout << "点在圆外" << endl;
}int main() {//创建圆Circle c1;Point center;c1.setR(5);center.setX(0);center.setY(0);c1.setCenter(center);//创建点Point p;p.setX(3);p.setY(4);//判断关系isInCircle(c1, p);return 0;
}

.h 文件中只写声明

.cpp 文件中只写实现

把类的声明和实现分开写

 对象特征

构造函数/析构函数

#include<iostream>
using namespace std;//对象的初始化和清理class Person {
public://1.构造函数 进行初始化//编译器自动调用一次Person() {cout << "Person 构造函数调用" << endl;}//2.析构函数 进行清理的操作//程序结束前调用~Person() {cout << "Person 析构函数调用" << endl;}
};
void test() {Person p;
}
int main() {test();//Person p;system("pause");return 0;
}

构造函数的分类及其调用

#include<iostream>
using namespace std;//1.构造函数的分类和调用
//分类
//按照参数分类  无参构造(默认构造函数) 和  有参构造
//按照类型分类  
class Person {
public:int age;Person() {cout << "Person无参构造函数" << endl;}Person(int a) {age = a;cout << "Person有参构造函数" << endl;}//拷贝构造函数Person(const Person &p) {//将传入的人身上的所有属性,拷贝到我身上age = p.age;cout << "Person 拷贝构造函数" << endl;}
};//调用
void test() {//1.括号法Person p1;//默认构造函数调用,不要加(),因为会认为是函数声明Person p2(10);Person p3(p2);//2.显示法Person p1;Person p2 = Person(10);//有参构造Person p3 = Person(p2);//拷贝构造//Person(10); //匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象//cout << "aaa" << endl;//不要利用拷贝构造函数 初始化匿名对象。编译器会认为是声明//3.隐式转换法Person p4 = 10;  //相当于 Person p4 = Person(10);Person p5 = p4; //拷贝构造
}
int main() {test();system("pause");return 0;
}

构造函数调用规则 

 深拷贝/浅拷贝

初始化列表 

#include<iostream>
using namespace std;
//初始化列表
class Person {
public://传统初始化操作/*Person(int a,int b,int c) {m_A = a;m_B = b;m_C = c;}*///初始化列表/*Person() :m_A(10), m_B(20), m_C(30) {}*/Person(int a,int b,int c) :m_A(a), m_B(b), m_C(c) {}int m_A;int m_B;int m_C;
};void test01() {//Person p(10, 20, 30);//创建对象//Person p;Person p(30, 20, 10);cout << "m_A=" << p.m_A << endl;cout << "m_B=" << p.m_B << endl;cout << "m_c=" << p.m_C << endl;
}int main() {test01();system("pause");return 0;
}

类对象作为类成员

#include<iostream>
#include<string.h>
using namespace std;
//类对象作为类成员
//B类中有对象A作为成员,A为对象成员//手机类
class Phone {
public://手机品牌名称string m_PName;Phone(string pName) {m_PName = pName;cout << "Phone的构造函数调用" << endl;}
};
//人类
class Person {
public://姓名string m_Name;//手机Phone m_Phone;//隐式转换Person(string name, string pName):m_Name(name),m_Phone(pName){cout << "Person的构造函数调用" << endl;}
};//测试案例
void test01() {Person p("张三", "华为");cout << p.m_Name << "拿着" << p.m_Phone.m_PName << "手机" << endl;
}
int main() {test01();//system("pause");return 0;
}

 静态成员 static

静态成员变量/静态成员函数

#include<iostream>
using namespace std;class Person {
public://1.所有对象都共享同一份数据//2.编译阶段就分配内存//3.类内声明,类外初始化操作static int m_A;//静态成员变量访问权限
private:static int m_B;
};int Person::m_A = 100;//Person作用域下
int Person::m_B = 4;void test01() {Person p;cout << p.m_A << endl;//100Person p2;p2.m_A = 200;cout << p.m_A << endl;//200  m_A是共享的
}void test02() {//静态成员变量 不属于某个对象上,所有对象都共享同一份数据//因此静态成员变量有两种访问方式//1.通过对象进行访问Person p;cout << p.m_A << endl;//2.通过类名进行访问cout << Person::m_A << endl;//cout << Person::m_B << endl; //报错,私有权限类外不能访问
}
int main() {//test01();test02();system("pause");return 0;
}

C++对象模型和this指针

成员变量和成员函数分开存储

#include<iostream>
using namespace std;
//成员变量和成员函数分开存储//*只有非静态成员变量才属于类的属性上
class Person {};void test01() {Person p;//空对象占用内存空间为:1//为了区分空对象占内存的位置//每个空对象也应该有一个独一无二的内存地址cout << "size of p= " << sizeof(p) << endl;
}void test02() {int m_A;//非静态成员变量  属于类的对象 大小为4static int m_B;//静态成员变量 不属于类的对象上 加上它还是4//void func() {} //非静态成员函数 不属于类的对象 还是4//静态成员函数 不属于类的对象
}int main() {test01();system("pause");return 0;
}

this指针

谁调用它,就指向谁

#include<iostream>
using namespace std;class Person {
public:Person(int age) {//this指针指向的是 被调用的成员函数所属的对象this->age = age;}int age;Person& PersonAddAge(Person &p) {this->age += p.age;//返回对象指针return *this;}
};//1.解决名称冲突
void test01() {Person p1(18);cout <<"p1的年龄为:" << p1.age << endl;
}//2.返回对象本身用 *this
void test02() {Person p1(10);Person p2(10);//链式编程思想 p2 = p2+p1+p1+p1p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);cout << "p2的年龄为:" << p2.age << endl;
}int main() {test01();test02();system("pause");return 0;
}

 

 


http://www.mrgr.cn/news/94713.html

相关文章:

  • RISC-V汇编学习(三)—— RV指令集
  • 第八节:红黑树(初阶)
  • 数据结构------线性表(顺序表)
  • 【极光 Orbit·STC8x】05. GPIO库函数驱动LED流动
  • 经历过的IDEA+Maven+JDK一些困惑
  • Python学习第十九天
  • 基于eNSP的IPV4和IPV6企业网络规划
  • 【NLP 38、实践 ⑩ NER 命名实体识别任务 Bert 实现】
  • llama-factory笔记
  • Flask使用Blueprint注册管理路由
  • 用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏
  • HarmonyOS NEXT开发实战——HUAWEI DevEco Studio 开发指南
  • 【NLP】10. 机器学习模型性能评估指标(含多类别情况), ROC,PRC
  • vue 知识点整理
  • 蓝桥杯 阶乘约数
  • 深度解析前端面试八股文:核心知识点与高效应对策略
  • 【C++基础十】泛型编程(模板初阶)
  • C++ 返回值优化(Return Value Optimization)
  • 用通义大模型写爬虫程序,汇总各科成绩
  • 2024浙江大学计算机考研上机真题