面向对象(C++语言核心内容)

1、面向对象概述:更符合人的思维,基于面向过程
2、类和对象抽象和类编写程序的目的:就是为了模拟现实世界的事务,解决现实中的问题,实现信息化。定义类:通常,将接口(类声明)放在头文件中,并将实现(类方法的代码)放在源代码文件中。使用class关键字声明类类定义一般有两部分:1、类声明:成员变量、成员方法           放到头文件中2、类方法定义:成员方法的具体实现    放到源代码文件中

3、学生类的编写与使用:
头文件声明(类声明):

#pragma once
#include <iostream>
#include <string>using namespace std;// 声明一个类使用class关键字,后边跟上类名{}
class Student {public:             //权限string m_Name;  // 姓名int m_Age;     // 年龄int m_Id;      // 学号void sleep(); //睡觉的方法void eat();void study();
};

类方法定义:

#include "Student.h"
#include <iostream>using namespace std;
//  使用Student:: 来标识一下类作用域
void Student::sleep() { cout << "学生睡觉" << endl;
}
void Student::eat() {cout << "学生吃饭" << endl;
}
void Student::study(){cout << "学生学习" << endl;
}

使用学生类:

#include <iostream>
#include "Student.h"
using namespace std;// 编写一个学生类,创建学生对象,使用学生对象int main() {// 创建学生对象Student s1;              //把Student对象创建在了栈区// 使用学生对象s1.m_Name = "zs";s1.m_Age = 20;s1.m_Id = 1101;cout << s1.m_Name << "\t" << s1.m_Age << "\t" << endl;// 调用对象的方法s1.sleep();s1.eat();s1.study();// 动态创建Student* p_stu = new Student;p_stu->sleep();return 0;
}
7、构造函数和析构函数构造函数:主要作用就是用于在创建对象时为对象的成员进行初始化析构函数:主要作用就是用于在对象销毁前,执行一些清理工作构造函数和析构函数,如果没有手动提供,编译器会提供一个默认的。默认的构造函数和析构函数中什么都不做。编译器会强制执行。构造函数和析构函数写到公共权限下构造函数:1、构造函数名和类名相同2、无返回值,也不用写void3、允许多个参数,可以重载析构函数:1、析构函数名和类名相同,前面加上~2、没有返回值,不用写void3、不允许有参数,不支持重载构造函数和析构函数由编译器自动调用,无需手动调用
8、构造函数分类和调用构造函数的分类:分类方式1:有参构造   无参构造(默认构造)分类方式2:普通构造   拷贝构造

拷贝构造函数示例

Person(const Person& p) {m_Age = p.m_Age;cout << "拷贝函数执行了..." << endl;
}
构造函数的调用:方式一(显式调用):Person p1 = Person();Person p2 = Person(30);Person p5 = Person(p1);  // 显式调用拷贝构造函数方式二(隐式调用):Person p3;     // 结尾不加圆括号  Person p3();是不对的Person p4(30);Person p6(p1); // 隐式调用拷贝构造函数
匿名对象:  Person();本行代码执行完之后立即释放
隐式转换法:Person p7 = 10;   // 不报错,因为编译器会转换成Person p7 = Person(10);利用隐式转换法调用拷贝构造函数Person p8 = p7;  // 编译器作转换:Person p8 = Person(p7);
初始化列表Person p8 = {};   // 调用无参构造Person p9 {20};    // 调用有参构造 相当于Person p9 = {20};
9、拷贝构造函数和调用时机Person(const Person& p){   // 加长const表示不让人对这个引入的Person进行修改m_Age = p.m_Age;            // 传递引用节省内存cout << " 拷贝构造函数 " << endl; }调用时机:(1)用一个对象初始化另一个对象(2)对象以值传递的方式 传递给函数参数void  doWork(Person p){}(3)函数局部对象以值传递的方式从函数返回Person doWork1(){Person p(30);return p;}返回值的优化:编译器会采用一种优化RVO( Return Value Optimization )。
10、构造函数的调用规则* 默认情况下,c++编译器至少会为我们提供类的3个函数(1)默认构造函数,无参,函数体为空(2)默认析构函数,无参,函数体为空(3)默认的拷贝构造函数,对类中非静态成员属性进行简单的值拷贝
11、深拷贝和浅拷贝
Person(char* name, int age) {// m_Name = name; 不可取m_name = new char(strlen(name) + 1);strcpy(m_Name, name);m_Age = age;
}
// 在构造函数里使用new关键字在堆里开辟了空间,那么在对象被销毁的时候,堆里的空间是没有被释放的,因为没有地方执行delete语句,那么我们需要在析构函数中释放那部分空间:
~Person() {if( m_name != nullptr ) {delete[] m_Name;m_Name = nullptr;}
}
浅拷贝:就是简单的值传递,不会重新为指针变量开辟内存
12、初始化列表一种语法,用来对成员数据进行初始化一般用来对const修饰的成员进行初始化,当然其他成员也可以。对于引用类型的成员,也必须使用初始化列表的语法进行初始化语法示例: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) {    // 构造函数}
13、类对象作为类成员当其他类对象作为本类中的成员,构造的顺序是:先调用其他类的构造,再调用本类的构造。析构的顺序与之相反。成员的构造先后顺序是根据在类中的先后顺序决定的,跟构造方法中的初始化顺序无关。
14、静态成员* 在类定义种,它的成员(成员变量,成员方法),这些成员都可以用关键字static声明,称之为静态成员。* 特点:不管这个类创建了多少个对象,静态对象只有一个拷贝。这个拷贝被所有属于这个类的对象所共享。* 静态成员变量:1、必须在类中声明,在类外定义。eg:class Person {public:int m_A; // 普通的成员变量int m_B; // 静态的成员变量,在类内声明};int Person::m_B = 100;  // 在类外定义(初始化)
15、单例设计模式单例:单个实例。设计模式:程序员的经验总结单例设计模式:一个类在一个程序中只能有一个对象。单例的好处:防止创建过多的对象。节省内存。具体实现:1)所有的构造函数都要私有化2)创建一个静态的实例,要私有化
16、this指针this指针本质上是个指针常量
17、常函数和常对象* 常函数void show() const{   //在这里加上const,那么在这个函数里,this指针无法修改其指向的内容了。this.age = 200;   //报错,因为常函数没法操作this指向的内容 }* 用const修饰成员函数时,const修饰this指针指向的内存区域。成员函数体内,不能修改本类中的任何普通成员变量。这个函数我们称之为常函数。* 例外:当成员变量类型前面被mutable修饰除外。 eg:mutable int height; *常对象创建对象时:const Person p2(30);常对象可以修改mutable修饰的成员变量常对象只能调用常函数,不能调用普通函数。
18、友元成员函数(全局)类的一个特点是数据隐藏(private)友元有三种:1、友元(全局)函数 (1)在类中声明,函数前加关键字friend(2)在全局区域内定义2、友元类3、友元成员函数
19、友元类:在类外访问一个类的私有成员。
20、友元成员函数(局部)友元的注意事项:(1)、友元关系不能被继承(2)、友元关系是单向的,类A是类B的朋友,类B未必是类A的朋友(3)、友元关系不具有传递性

CSP考试笔记:C++篇(第四章、面向对象)(牛客网学习)相关推荐

  1. CSP考试笔记:C++篇(第一章:C++基础语法)(牛客网学习)

    一.C++的应用领域 1.大型桌面应用程序 2.大型网络后台(eg:Google的搜索引擎) 3.游戏引擎 4.数据库 5.操作系统,驱动程序 二.优缺点: 优:强大的抽象封装能力高性能.低功耗(为减 ...

  2. 牛客网学习笔记——简单题们(二)

    HJ22 汽水瓶 描述 某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还).小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水. 数据范围:输入的正整数满足 1 \ ...

  3. 牛客c语言数组,牛客网学习笔记 - C/C++

    常见的字符转意: & a m p ; 表示  & & l t ; 表示 < & g t ; 表示 > & q u o t ; 表示 " & ...

  4. 牛客网学习笔记-day01

    Java修饰符大小 public>protected>default>private final方法不等同于private方法 虽然类中的private方法都隐式地指定为final, ...

  5. 牛客网《BAT面试算法精品课》学习笔记

    目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...

  6. 牛客网论坛最具争议的 Java 面试成神笔记,GitHub 已下载量已过百万

    程序员内部一直流传这一句话:面试看牛客 刷题看力扣牛客网作为国内最牛的程序员面试网站,一直在程序员内部颇负盛名,其中用户更是卧虎藏龙! 有国内一线大厂的企业招聘 还有一些低调的互联网大牛实力就和天龙八 ...

  7. 牛客网论坛最具争议的Java面试成神笔记,GitHub已下载量已过百万

    程序员内部一直流传这一句话: 面试看牛客 刷题看力扣 牛客网作为国内最牛的程序员面试网站,一直在程序员内部颇负盛名,其中用户更是卧虎藏龙! 有国内一线大厂的企业招聘 还有一些低调的互联网大牛实力就和天 ...

  8. 牛客网扫地僧开源出来的《Java 面试无敌流笔记》,Github 上线两天就爆火

    为什么要公开这些面试题? 原因一:身边从事 Java 开发的人员越来越多,我的表弟表妹们,朋友的表弟表妹们,朋友的朋友的表弟表妹们,每次问我要相同的面试复习材料,已经让我疲于应付,索性整理出来,直接发 ...

  9. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

最新文章

  1. Tensorflow会话
  2. 【CODEVS2776】寻找代表元
  3. 如何隐藏system函数的窗口
  4. bzoj1878: [SDOI2009]HH的项链
  5. python3:语法变动 及新特性
  6. 如何写一个vue指令directive
  7. DX10 Shadow Volumn Sample Code的Bug修正
  8. python学习笔记--python数据类型
  9. Redis命令之scan、sscan、hscan、zcan
  10. php简历制作网站,PHP制作word简历
  11. b250支持服务器cpu,b250m主板应该上什么cpu
  12. java中protected的作用域_java作用域public ,private ,protected
  13. 阿里云香港和大陆的服务器分析
  14. px4直升机混控逻辑整理
  15. Android高仿陌陌应用点点滑动效果
  16. linux查看进程被kill原因,定位Linux下定位进程被谁KILL
  17. python爬虫登录微博_python爬虫-模拟微博登录
  18. 特斯拉被赶超?马斯克要急了!
  19. 堪称神器的5款电脑软件,建议收藏
  20. android 钢琴识别音阶对错_Sans钢琴音阶

热门文章

  1. Linux环境强制删除文件
  2. 23.Android 软键盘工具ImeUtil
  3. java银行账户模拟_使用Java模拟银行账户存、取款、转账功能
  4. [内附完整源码和文档] 基于JAVA的房屋中介管理系统
  5. jCore中文本地化工作札记 - 2
  6. Object转boolean类型,Object转int类型,打包报错,提示:object找不到int
  7. 《挑战程序设计竞赛》之“反转”问题总结
  8. 只需九步让你新站成为高权重网站
  9. 手机 Python 编程神器!
  10. smart200PLC TCP通讯