面向对象

  • 每个对象内存地址独一无二,空对象分配一个字节空间
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person{
public:
//  int m_A;void func(){}
//  static  int m_B;static void fun2(){};
//  double m_C;
};
//int Person::m_B = 0 ;
void test01(){Person p1;cout<<"size="<< sizeof(p1)<< endl;
};
int main() {test01();
//  system("pause");return EXIT_SUCCESS;
}

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Person{
public:int m_A;void func(){}static  int m_B;static void fun2(){};double m_C;
};
int Person::m_B = 0 ;
void test01(){Person p1;cout<<"size="<< sizeof(p1)<< endl;
};
int main() {test01();
//  system("pause");return EXIT_SUCCESS;
}

this 指针的使用

  • 解决名字相同的冲突
  • 隐式加在每个成员函数中
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;class Person
{
public:Person(int age){//用途1 :解决名称冲突this->age = age;}//this指针 隐式加在每个成员函数中bool compareAge(Person &p){if (this->age == p.age){return true;}return false;}Person&  personAddPerson(Person &p){this->age += p.age;return *this; //*this 就是本体}int age;
};void test01()
{//this指针 指向 被调用的成员函数 所属的对象Person p1(10);cout << "p1的年龄为: " << p1.age << endl;Person p2(10);bool ret = p1.compareAge(p2);if (ret){cout << "p1与p2年龄相等" << endl;}p1.personAddPerson(p2).personAddPerson(p2).personAddPerson(p2); //链式编程cout << "p1的年龄为: " << p1.age << endl;}
int main(){test01();system("pause");return EXIT_SUCCESS;
}

空指针访问成员函数

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;class Person
{
public:Person(int age){//用途1 :解决名称冲突this->age = age;}//this指针 隐式加在每个成员函数中bool compareAge(Person &p){if (this->age == p.age){return true;}return false;}Person&  personAddPerson(Person &p){this->age += p.age;return *this; //*this 就是本体}int age;
};void test01()
{//this指针 指向 被调用的成员函数 所属的对象Person *p = NULL;cout<<p->age<<endl;}
int main(){test01();system("pause");return EXIT_SUCCESS;
}

常函数和常对象

  • 常对象只能调用常函数
  • 常函数中不可修改,但是可以通过mutable 修改
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;class Person
{
public:int age{0};mutable int m_A; // 常函数中或者常对象,有些特殊属性依然想修改,加入关键字mutable;Person(int age){this->age = age;}// 指针的指向不可修改,指针指向的值可以修改void showPerson() const{m_A =100;cout<< this->m_A<<endl;}void func(){age = 100;cout<<"func调用"<<endl;}
};
void test01()
{// 常对象声明,常对象调用常函数const Person p1(100);p1.m_A = 100;}
int main(){test01();
//  system("pause");return EXIT_SUCCESS;
}

友员函数

  • 提供访问私有变量的机会
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;class Person
{friend void sayAge(Person *p);
public:int age{0};mutable int m_A; // 常函数中或者常对象,有些特殊属性依然想修改,加入关键字mutable;Person(int age){this->age = age;}// 指针的指向不可修改,指针指向的值可以修改void showPerson() const{m_A =100;cout<< this->m_A<<endl;}void func(){age = 100;cout<<"func调用"<<endl;}
private:string name = "人";
};
void test01()
{// 常对象声明,常对象调用常函数const Person p1(100);p1.m_A = 100;Person *p2 = new Person(10) ;sayAge(p2);}
void sayAge(Person *p){cout<<p->name<<endl;
}
int main(){test01();
//  system("pause");return EXIT_SUCCESS;
}

友元类

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:GoodGay();void visit();Building * m_building;
};class Building
{//让goodGay类作为 Building的好朋友,可以访问私有成员friend class GoodGay;public:Building();string m_SittingRoom;private:string m_BedRoom;
};Building::Building()
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{this->m_building =  new Building;
}void GoodGay::visit()
{cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;
}void test01()
{GoodGay gg;gg.visit();
}int main(){test01();system("pause");return EXIT_SUCCESS;
}

成员函数作为友元函数

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:GoodGay();void visit(); //可以访问building的私有void visit2(); // 不可以访问building的私有Building * m_building;
};class Building
{//让GoodGay类中的 visit成员函数作为友元friend void GoodGay::visit();
public:Building();string m_SittingRoom;private:string m_BedRoom;
};Building::Building()
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{this->m_building = new Building;
}void GoodGay::visit()
{cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;
}void GoodGay::visit2()
{cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;//cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;
}void test01()
{GoodGay gg;gg.visit();gg.visit2();
}int main(){test01();system("pause");return EXIT_SUCCESS;
}

c++从入门到精通——面向对象初探以及友元函数、对象相关推荐

  1. Simulink仿真入门到精通(十) S函数

    Simulink仿真入门到精通(十) S函数 10.1. S函数的概述 10.2 S函数的类型 10.3 S函数的要素 10.4 S函数的组成及执行顺序 10.5 使用不同的语言编写S函数 10.5. ...

  2. oracle从入门到精通(4)------运算符,分组查询,函数

    oracle入门到精通(4) --------------------------------------------- 1.运算符 2.分组查询 3.函数 --------------------- ...

  3. 【OpenGL从入门到精通(六)】纹理对象与纹理坐标

    1.在OpenGL想要显示一张图片,需要先绘制一个自定义的几何体. 2.把图片加载到纹理对象中= 3.当进行纹理贴图时候,使用纹理坐标来设置纹理对象. 2.

  4. Python实战从入门到精通第十八讲——改变对象的字符串显示

    想改变对象实例的打印或显示输出,让它们更具可读性. 要改变一个实例的字符串表示,可重新定义它的 __str__() 和 __repr__() 方法.例如: lass Pair:def __init__ ...

  5. 【PHP】最详细PHP从入门到精通(二)——PHP中的函数

     PHP从入门到精通 之PHP中的函数 各位开发者朋友大家好,自上次更新PHP的相关知识,得到了大家的广泛支持.PHP的火爆程度不言而喻,函数作为PHP中极为重要的部分,应诸位的支持,博主继续跟进更新 ...

  6. coreldraw x8段落_CorelDRAW X8中文版从入门到精通

    CorelDRAW X8中文版从入门到精通 ◎内容结构 ◎编写特色 ◎读者对象 如何获取云空间资料 一 扫描关注微信公众号 二 获取资料下载地址和密码 三 打开资料下载页面 四 输入密码并下载资料 1 ...

  7. 手牵手教你写代码,从入门到精通

    如果说到什么是好代码,我们肯定都能说出一堆规则,例如使用一致的格式和缩进.使用清晰的变量名和方法名.在必要时提供文档与注释.不要过度精简代码等等. 但是对于什么是烂代码,你有比较清晰的认识吗? 在 G ...

  8. 视频教程-JSP从入门到精通2016+在线视频教学平台项目实训-其他

    JSP从入门到精通2016+在线视频教学平台项目实训 19年软件开发经验,设计开发40多个大型软件,10年从事高等教育,主要为java系列课程,带你轻松进入java生涯. 赖国荣 ¥68.00 立即订 ...

  9. 《C++ 开发从入门到精通》——第2章 C++的重要特质分析2.1 什么是面向对象(object-oriented)...

    本节书摘来自异步社区出版社<C++ 开发从入门到精通>一书中的第2章,第2.1节,作者: 王石磊 , 韩海玲,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第2 ...

最新文章

  1. 攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗
  2. express不是内部或外部命令,也不是可运行的程序
  3. postman模拟HTTP请求
  4. 让浏览器变身代码编辑器
  5. C语言博客作业--结构体
  6. 设置 Xcode 自动生成代码片段
  7. PASCAL不仅仅是语言
  8. mysql 通过存储过程 插入测试百万数据
  9. 人工智障学习笔记——机器学习(12)LDA降维
  10. android侧滑菜单ui,Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单
  11. SQL 全文索引 CONTAINS
  12. excel文件压缩 定位条件 对象
  13. vue 抽离公共方法
  14. 斯托克斯公式(三维中两类曲面和第二类曲线互相转换)
  15. 大案牍术——我们或是只是一串数字
  16. 吕 思 伟 ---- 潘 爱 民 :: ATL 介 绍( 三)
  17. Java50道经典编程题:(十三)数字谜题 ——循环语句及判断符的使用
  18. vue3.0移动端 ui_vue.js的移动UI元素
  19. 解决网站加载图片太慢
  20. 使用 logrotate 配置 supervisor 进行日志管理按天备份

热门文章

  1. WMS WFS WCS 的区别
  2. 关于MongoCollection.find(Bson var1)方法的问题
  3. 【贝店】2019-让更多人过上更好生活。
  4. 智慧校园对教学的影响是什么?
  5. 达梦数据库DSC搭建
  6. 数据库设计之EAV(实体、属性、值)
  7. 面向对象高级编程(上)-- 第一周学习笔记(Boolan)
  8. python高考谣言_新浪微博中文谣言数据
  9. C语言:根据整型形参m的值,计算如下公式的值: T=1-1/2x2-1/3x3...1/mxm; 例如,若m中的值为5,则应输出:0.536389。
  10. IC设计- 浅谈各种验证 - 功能验证,形式验证,原型验证