C++面向对象——类与对象

文章目录

    • 类与对象
    • 构造函数、析构函数
    • get/set方法
    • 函数:类内声明、类外定义
    • static
    • this指针
    • 友元
    • 名字空间

类与对象

#include<iostream>
#include<string>
using namespace std;
/*
类与对象 
*/
class Person{public:string name;// 固有属性,成员变量 int age;public:void eat(){ // 成员函数,成员方法 cout<<"eat()"<<endl;}void show(){cout<<"[name:"<<name<<", age:"<<age<<"]"<<endl;} 
};
int main(){Person p1;  // 实例化对象 p1.name = "AAA";p1.age = 11;p1.eat();p1.show();return 0;
} 

构造函数、析构函数

#include<iostream>
#include<string>
using namespace std;/*
构造函数类成员属性 
public属性的成员对外可见,对内可见。
private属性的成员对外不可见,对内可见。
protected属性的成员对外不可见,对内可见,且对派生类是可见的。
*/class Person{public: // 公开,哪里都可以访问 string name;// 固有属性,成员变量 int age;public: // 公开,哪里都可以访问 Person(){// 无参构造 cout<<"构造函数:Person()"<<endl;} Person(string _name,int _age){// 有参构造函数  name = _name;age = _age;cout<<"构造函数:Person(string _name,int _age)"<<endl;}Person(const Person& p){ // 复制构造函数 name = p.name;age = p.age;cout<<"构造函数:Person(const Person& p)"<<endl;}~Person(){ // 析构函数// 析构函数:无法重载,析构顺序与构造顺序相反 cout<<"~Person()"<<name<<endl; }void show(){ // 成员函数,成员方法 cout<<"[name:"<<name<<", age:"<<age<<"]"<<endl;}
};
int main(){Person p1;  // 实例化对象,调用无参构造函数 p1.name = "AAA"; // errorp1.age = 11;p1.show();Person p2("BBB", 12);// 实例化对象,调用有参构造函数 p2.show();Person p3(p1);p3.show(); return 0;
} 

get/set方法

#include<iostream>
#include<string>
using namespace std;/*
get/set方法 
*/
class Person{private: // 私有,仅类内可以访问 string name;// 固有属性,成员变量 int age;public: // 公开,哪里都可以访问 Person(){// 无参构造 cout<<"构造函数:Person()"<<endl;} Person(string _name,int _age){// 有参构造函数  name = _name;age = _age;cout<<"构造函数:Person(string _name,int _age)"<<endl;}Person(const Person& p){ // 复制构造函数 name = p.name;age = p.age;cout<<"构造函数:Person(const Person& p)"<<endl;}~Person(){ // 析构函数// 析构函数:无法重载,析构顺序与构造顺序相反 cout<<"~Person()"<<name<<endl; }// 提供get/set方法 void setName(string _name){ name = _name; } string getName(){ return name; }void setAge(int _age){ age = _age; }int getAge(){ return age; }void show(){ // 成员函数,成员方法 cout<<"[name:"<<name<<", age:"<<age<<"]"<<endl;}
};
int main(){Person p1;  // 实例化对象,调用无参构造函数 
//	p1.name = "AAA"; // error
//	p1.age = 11;p1.setName("AAA");p1.setAge(11);p1.show();Person p2("BBB", 12);// 实例化对象,调用有参构造函数 p2.show();Person p3(p1);p3.setName("CCC");p3.show(); return 0;
} 

函数:类内声明、类外定义

#include<iostream>
#include<string>
using namespace std;/*
函数:类内声明、类外定义 
*/class Person{private: // 私有,仅类内可以访问 string name;// 固有属性,成员变量 int age;public: // 公开,哪里都可以访问 Person(); // 无参构造函数的声明 Person(string _name,int _age);// 有参构造函数的声明  Person(const Person& p); // 复制构造函数的声明 ~Person(); // 析构函数的声明 // 提供get/set方法 void setName(string _name){ name = _name; } string getName(){ return name; }void setAge(int _age){ age = _age; }int getAge(){ return age; }void show(){ // 成员函数,成员方法 cout<<"[name:"<<name<<", age:"<<age<<"]"<<endl;}
};// 构造函数的类外实现 
Person::Person(){// 无参构造 cout<<"构造函数:Person()"<<endl;
} 
Person::Person(string _name,int _age){// 有参构造函数  name = _name;age = _age;cout<<"构造函数:Person(string _name,int _age)"<<endl;
}
Person::Person(const Person& p){ // 复制构造函数 name = p.name;age = p.age;cout<<"构造函数:Person(const Person& p)"<<endl;
}
Person::~Person(){ // 析构函数
// 析构函数:无法重载,析构顺序与构造顺序相反 cout<<"析构函数:~Person()"<<name<<endl; 
}int main(){Person p1; 
//	p1.name = "AAA"; // error
//	p1.age = 11;p1.setName("AAA");p1.setAge(11);p1.show();Person p2("BBB", 12);// 实例化对象,调用有参构造函数 p2.show();Person p3(p1);p3.setName("CCC");p3.show(); return 0;
} 

static

#include<iostream>
#include<string>
using namespace std;/*
内联成员函数,使用inline关键字将函数定义为内联函数。
对于成员函数来说,如果其定义是在类体中,即使没有使用inline关键字,该成员函数也被认为是内联成员函数。static 关键字: 静态成员属于类 
对于静态成员来说,不仅可以通过对象访问,还可以直接使用类名访问:
----------------临时分割线 
静态数据成员可以是当前类的类型,而其他数据成员只能是当前类的指针或引用类型
类的静态成员函数只能访问类的静态数据成员,而不能访问普通的数据成员。
静态成员函数不能定义为const成员函数,即静态成员函数末尾不能使用const关键字。
*/class Person{private: // 私有,仅类内可以访问 string name;// 固有属性,成员变量 int age;public: // 公开,哪里都可以访问 static int cnt; Person(); // 无参构造函数的声明 Person(string _name,int _age);// 有参构造函数的声明  Person(const Person& p); // 复制构造函数的声明 ~Person(); // 析构函数的声明 // 提供get/set方法 void setName(string _name){ name = _name; } string getName(){ return name; }void setAge(int _age){ age = _age; }int getAge(){ return age; }void show(){ // 成员函数,成员方法 cout<<"[name:"<<name<<", age:"<<age<<"]"<<endl;}
};
int Person::cnt = 0; // 初始cnt // 构造函数的类外实现 
Person::Person(){// 无参构造 cnt ++;cout<<"构造函数:Person()"<<endl;
} 
Person::Person(string _name,int _age){// 有参构造函数  cnt ++;name = _name;age = _age;cout<<"构造函数:Person(string _name,int _age)"<<endl;
}
Person::Person(const Person& p){ // 复制构造函数 cnt ++;name = p.name;age = p.age;cout<<"构造函数:Person(const Person& p)"<<endl;
}
Person::~Person(){ // 析构函数cnt --; 
// 析构函数:无法重载,析构顺序与构造顺序相反 cout<<"析构函数:~Person()"<<name<<endl; cout<<Person::cnt<<endl;
}
int main(){
//	cout<<cnt<<end; // errorcout<<Person::cnt<<endl; // 0Person p1; // 实例化对象,调用无参构造函数 
//	p1.name = "AAA"; // error
//	p1.age = 11;p1.setName("AAA");p1.setAge(11);p1.show();cout<<Person::cnt<<endl; // 1Person p2("BBB", 12);// 实例化对象,调用有参构造函数 p2.show();cout<<Person::cnt<<endl; // 2Person p3(p1);p3.setName("CCC");p3.show(); cout<<Person::cnt<<endl; // 3cout<<p3.cnt<<endl; // 3 return 0;
} 

this指针

同一类的各个对象创建后,都在类中产生自己成员的副本。
对象在副本中与成员函数建立关系是通过C++为成员函数提供的一个称为this的指针来进行的。

当创建一个对象时,this指针就初始化指向该对象。
当某一对象调用一个成员函数时,this指针将作为一个变元自动传给该函数。所以,不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。

this指针是由C++编译器自动产生且较常用的一个隐含对象指针,它不能被显式声明。
this指针是一个局部量,局部于某个对象。
this指针是一个常量,它不能作为赋值、递增、递减等运算的目标对象。
只有非静态类成员函数才拥有this指针,并通过该指针来处理对象。

友元

  1. 将普通函数声明为友元函数
#include <iostream>
using namespace std;  
// 将普通函数声明为友元函数的程序示例。
class Date {private:       // 数据成员int year;     // 年int month;    // 月int day;      // 日public:        // 公有成员Date(int y, int m, int d) : year(y), month(m), day(d) {}  // 构造函数friend void Show(const Date& dt);  // 输出日期,声明为友元void display(){cout << year << "年" << month << "月" << day << "日" << endl;}
};
void Show(const Date& dt) {  // 输出日期cout << dt.year << "年" << dt.month << "月" << dt.day << "日" << endl;
}
int main() {Date dt(2009, 6, 18);  // 定义日期对象dt;Show(dt);              // 输出日期2009年6月18日dt.display();          // 通过成员函数访问 return 0;
}
  1. 将类Spouse声明为类Person的友元类
#include <cstring>
#include <iostream>
using namespace std;
// 将类Spouse声明为类Person的友元类
class Person;          // 对类Person的提前引用声明
class Spouse {         // 声明夫妻类private:            // 数据成员Person* pHusband;  // 丈夫Person* pWife;     // 妻子public:             // 公有成员Spouse(const Person& hus, const Person& wf);  // 构造函数~Spouse() { delete pHusband; delete pWife; }  // 析构函数void Show() const;  // 输出信息
};class Person {private:             // 数据成员char name[18];      // 姓名int age;            // 年龄char sex[3];        // 性别public:              // 公有成员Person(char* nm, int ag, char* sx) : age(ag) {  // 构造函数strcpy(name, nm), strcpy(sex, sx);}void Show() const { cout << name << " " << age << "岁 " << sex << endl; }friend class Spouse;  // 声明类Spouse为类Person的友元类
};Spouse::Spouse(const Person& hus, const Person& wf) {pHusband = new Person(hus);  // 为丈夫对象分配存储空间pWife = new Person(wf);      // 为妻子对象分配存储空间
}void Spouse::Show() const {  // 输出信息cout << "丈夫:" << pHusband->name << " " << pHusband->age << "岁" << endl;cout << "妻子:" << pWife->name << " " << pWife->age << "岁" << endl;
}int main() {Person huf("张强", 32, "男");  // 定义丈夫对象Person wf("吴珊", 28, "女");   // 定义妻子对象Spouse sp(huf, wf);            // 定义夫妻对象huf.Show();                    // 输出丈夫信息wf.Show();                     // 输出妻子信息sp.Show();                     // 输出夫妻信息return 0;                      // 返回值0, 返回操作系统
}
  1. 将另一个类的成员函数声明为一个类的友元函数
#include <cstring>
#include <iostream>
using namespace std;
// 将另一个类的成员函数声明为一个类的友元函数
class Person;          // 对类Person的提前引用声明
class Spouse {         // 声明夫妻类private:            // 数据成员Person* pHusband;  // 丈夫Person* pWife;     // 妻子public:             // 公有成员Spouse(const Person& hus, const Person& wf);  // 构造函数~Spouse() {delete pHusband;delete pWife;  // 析构函数}void Show() const;  // 输出信息
};
class Person {private:             // 数据成员char name[18];      // 姓名int age;            // 年龄char sex[3];        // 性别public:              // 公有成员Person(char* nm, int ag, char* sx) : age(ag) {  // 构造函数strcpy(name, nm), strcpy(sex, sx);}void Show() const {  // 输出信息cout << name << " " << age << " " << sex << endl;}// 声明类Spouse的成员函数Show()为类Person的友元函数friend void Spouse::Show() const;
};
Spouse::Spouse(const Person& hus, const Person& wf) {pHusband = new Person(hus);  // 为丈夫对象分配存储空间pWife = new Person(wf);      // 为妻子对象分配存储空间
}
void Spouse::Show() const {  // 输出信息cout << "husband:"<<pHusband->name<<" "<<pHusband->age<<" "<<endl;cout << "wife:" << pWife->name << " " << pWife->age << " " << endl;
}
int main() {                       // 主函数main()Person huf("张强", 32, "男");  // 定义丈夫对象Person wf("吴珊", 28, "女");   // 定义妻子对象Spouse sp(huf, wf);            // 定义夫妻对象huf.Show();                    // 输出丈夫信息wf.Show();                     // 输出妻子信息sp.Show();                     // 输出夫妻信息return 0;                      // 返回值0, 返回操作系统
}

名字空间

#include <iostream>
using namespace std;namespace A {string a;void show() {cout << "A::show()" << endl;}
}int main() {A::show();using namespace A;show();return 0;
}
  • 嵌套名字空间
#include <iostream>
using namespace std;namespace A {string a;void show() {cout << "A::show()" << endl;
}
namespace B {
string b;
void show() {cout << "A::B::show()" << endl;
}
}
} int main() {A::show();A::B::show();using namespace A;show();B::show();return 0;
}

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

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

相关文章

第二期书生浦语大模型训练营第四次笔记

大模型微调技术 大模型微调是一种通过在预训练模型的基础上&#xff0c;有针对性地微调部分参数以适应特定任务需求的方法。 微调预训练模型的方法 微调所有层&#xff1a;将预训练模型的所有层都参与微调&#xff0c;以适应新的任务。 微调顶层&#xff1a;只微调预训练模型…

oracle 12c+ max_string_size参数

一个客户的数据库版本是19.3,在做数据库复制的时候,目标端报错了,查看了一下问题发现表的字段长度有不对,在12c以前我们都知道varchar的长度最大是4000,但是客户这里居然有32767: 把客户的建表语句弄出来,放到我的一个19c的测试环境进行测试: 发现报错了: 这里报错很明显了,是M…

开通一个幻兽帕鲁专用服务器多少钱?阿里云挺便宜

阿里云开通一个幻兽帕鲁专用服务器多少钱&#xff1f;26元1个月。目前阿里云幻兽帕鲁专用服务器4核16G配置26.52元1个月、149元半年&#xff0c;8核32G服务器90.60元一个月、271.80元3个月&#xff0c;幻兽帕鲁服务器活动页面 aliyunfuwuqi.com/go/palworld 阿里云服务器网整理…

$nextTick 原理及作用

Vue 的 nextTick 其本质是对 JavaScript 执行原理 EventLoop 的一种应用。 nextTick 的核心是利用了如 Promise 、MutationObserver、setImmediate、setTimeout的原生 JavaScript 方法来模拟对应的微/宏任务的实现, 本质是为了利用 JavaScript 的这些异步回调任务队列来实现…

auto关键字的妙用

基本概念 C11中的auto关键字是C语言的一个重大改进&#xff0c;它提供了一种类型推导的机制&#xff0c;允许开发者让编译器自动推导变量的类型&#xff0c;从而简化代码并提高可读性。 常见使用场景 1、循环中迭代变量的类型推导 当处理容器或其他迭代器时&#xff0c;aut…

学习c语音的自我感受

因为是自学&#xff0c;所以走过不少弯路。去年&#xff0c;受知乎“python性能弱”风潮的影响&#xff0c;学过go,rust。 在学习这些新语言的时候&#xff0c;由衷感受到&#xff0c;或是本身侧重方向的原因&#xff08;如go侧重服务器&#xff09;&#xff0c;或是语言太新不…

uniapp——组件多颜色模块展示、气泡框

一、自定义颜色&#xff1a; 样式 代码 <template><view class"content"><!-- 右上角 --><view class"coverStatus" :class"[itemClass, positionClass,cornerClass,sanJiaoCss,sanJiaoCss2]":style"dynamicStyle&q…

python getsize如何使用

第一步&#xff0c;点击键盘 winr&#xff0c;打开运行窗口&#xff1b;在窗口中输入“cmd"&#xff0c;点击确定&#xff0c;打开windows命令行窗口。 第二步&#xff0c;在windows命令行窗口中&#xff0c;输入“python”&#xff0c;进入python交互窗口。 第三步&#…

【Linux】解决切换用户出现bash-4.2$问题

切换用户出现 bash 4.2 问题 出现 bash 4.2 错误 发现是用户指定家目录下 缺少2个隐藏文件 这题前提条件 我指定的家目录是 /opt/{孙悟空,猪八戒,唐僧,沙悟净} /etc/skel/.bashrc /etc/skel/.bash_profile 传过去后显示登录成功 问题展示&#xff1a; [rootlocalhost…

前端系列-2 模块化CommonJs+AMD+CMD+ES6

模块化 js中, 一个文件就是一个模块&#xff0c;模块化可以提高代码利用率而减少重复代码&#xff0c;将相同的逻辑维护在一个模块中&#xff0c;分而治之&#xff0c;提高代码的可维护性&#xff1b;另外&#xff0c;模块化的出现可以在工程中引入第三方模块&#xff0c;极大…

揭秘油烟净化器保持餐饮厨房清新通畅的秘诀

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 在餐饮厨房中&#xff0c;油烟净化器的作用不可忽视。它不仅是清洁空气的工具&#xff0c;更是提升生活品质的保障。让我们一…

音频数据分析注意事项

注意事项一、音频读取 1.librosa.load(path, sr16000) 读取的结果是&#xff0c;数据类型是浮点型 2.df_yin wave.open(path, rb) params df_yin.getparams() nchannels, sampwidth, framerate, nframes params[:4] strData df_yin.readframes(nframes) data np.frombuf…

笔记 | 嵌入式系统概论

1 嵌入式系统简介 1.1 嵌入式系统的定义 根据美国电气与电子工程师学会&#xff08;IEEE&#xff1a;Institute of Electrical and Electronics Engineers )的定义&#xff0c;嵌入式系统是用于控制、监视或辅助操作机器和设备的装置(原文: devices used to control, monitor…

WiFi、Ethenet、4G优先级切换

1、多网卡情况下如何调整优先级方案 按照目前公司前辈给出的方案&#xff0c;调整优先级的手段有两种&#xff1a; <1>.删除默认路由--route del 的方法 <2>.ifmetric源码提供的修改路由表的mteric的值来设置路由的优先级&#xff0c;metric越小优先级越高。 应…

ANSYS Help 的使用

ANSYS 帮助文档是相当实用且重要的第一手资料&#xff0c;90% 以上的纯操作问题都可以在帮助文档找到相关的解释。 点击开始菜单的 ANSYS Help即可打开帮助文档 帮助文档有两种打开方式&#xff1a; 基于帮助文档的安装包安装于本地后&#xff0c;可直接启动帮助程序没有安装…

Spring-IOC之组件扫描

版本 Spring Framework 6.0.9​ 1. 前言 通过自动扫描&#xff0c;Spring 会自动从扫描指定的包及其子包下的所有类&#xff0c;并根据类上的特定注解将该类装配到容器中&#xff0c;而无需在 XML 配置文件或 Java 配置类中逐一声明每一个 Bean。 支持的注解 Spring 支持一系…

书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)

书生浦语大模型实战营之Llama 3 高效部署实践&#xff08;LMDeploy 版&#xff09; 环境&#xff0c;模型准备LMDeploy chatTurmind和Transformer的速度对比LMDeploy模型量化(lite)LMDeploy服务(serve) 环境&#xff0c;模型准备 InternStudio 可以直接使用 studio-conda -t …

机器学习运用-民宿价格

项目简介 随着旅游业的蓬勃发展&#xff0c;民宿市场迎来了前所未有的增长机遇。正好最近在参加拓尔思数据挖掘公益实习活动&#xff0c;我的项目将应用机器学习技术开发一个价格预测模型。可以达到更好地理解和预测民宿价格的目的&#xff0c;该模型综合考虑了从容纳人数、便…

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为&#xff1a; Python函数的黑魔法&#xff1a;递归&#xff0c;嵌套函数与装饰器 个人主页&#xff1a;CILMY23-CSDN博客 系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff…

基于51单片机的矩阵按键扫描的proteus仿真

文章目录 一、按键按键按键消抖 二、独立按键仿真图仿真程序 三、矩阵按键仿真图仿真程序 四、总结 一、按键 按键 按键通常指的是电子设备上的一种输入装置&#xff0c;用于在按下时发送信号&#xff0c;以便设备执行相应的操作。按键可以分为独立按键和矩阵按键两种类型。 …