面向对象编程的三大特性:封装、继承、多态
具有相同属性(数据结构)和行为(对数据结构的操作)的抽象为类。
封装:将属性和性质封装在一块儿
class类名 { 访问 权限 :属性 | 行为 }

1、访问权限
public:公共权限,类的内外都可以访问
private:私有权限,类内可以访问,类外不可以访问
在继承关系中,父类可以访问,子类不可以访问
protected:保护权限,类内可以访问,类外不可以访问
在继承关系中,父类可以访问,子类可以访问

2、struct和class的区别:
struct的默认权限为公有,class的默认权限为私有(在没有声明是什么权限的时候)
将成员属性设置为私有:
1、可以自行设定读写权限,
2、对于写可以检测数据的有效性(在赋值之前检测数据的范围)

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class cube{private:double a,b,c;public:void get_info(double x,double y,double z){if(x <=0 || y <= 0 || z <= 0){cout << "it can't be a cube! Please try again" << endl;return ;}a = x;b = y;c = z;}double get_superficial(){return 2*(a*b + b*c + c*a);}double get_volume(){return (a*b*c);}double get_len(){return a;}double get_height(){return c;}double get_width(){return b;}bool equal(cube cb){if(cb.get_len() == a && cb.get_width() == b && cb.get_height() == c)return true;else return false;}//用成员函数实现两个立方体的比较,只用传入一个参数
};bool equality(cube c1,cube c2){if(c1.get_len() == c2.get_len() && c1.get_width() == c2.get_width() && c1.get_height() == c2.get_height())return true;else return false;
}
//用函数实现两个立方体的可以用两个参数来获得

3、构造函数和析构函数
如果不提供构造函数和析构函数,编译器会提供,编译器提供的构造函数和析构函数是空实现。
构造函数
1)在类创建的时候调用,进行初始化
2)在类创建的时候执行一次
3)可以有参数,可以有返回,可以重载

构造函数的分类以及调用
两种分类方式:
1)按照参数

  • 有参构造
    直接在括号内部传入参数
  • 无参构造(默认构造函数)
    (无参构造之后不能加括号,否则被编译器解释为函数调用)
Person p()://这种写法会被编译器当成函数声明,创建一个函数对象

2)按照类型分类

  • 普通构造
    直接传入参数(内置类型)
  • 拷贝构造
    传入的是类,将类所拥有的属性都赋值给新的类

三种调用方式
括号法:

Person p1://调用默认构造函数
Person p(10);//有参构造函数
Person p()://这种写法会被编译器当成函数声明,创建一个函数对象
Person p0(p1);//拷贝构造

显示法:

Person p = Person(10);//Person(10)为匿名对象,参数构造
Person p2 = Person(p);//为p的拷贝构造
//1)匿名对象,当前行执行完,立刻回收匿名对象
//2)不要用拷贝对象来初始化匿名对象,相当于重复创建一个类,Person(p3) 等价于 Person p3;

隐式调用:

Person p = 10;//相当于Person p = Person(10)
Person p4 = p3;//相当于Person p4 = Person(p3)

构造函数的调用原则
1)编译器会为类设计
①默认构造函数(无参、函数体为空)
②默认析构函数(无参,函数体为空)
③默认拷贝函数(拷贝类的属性)

2)调用原则
①程序员提供了含参构造函数,编译器就不会再提供默认构造函数,但是会提供拷贝构造函数
②程序员提供了拷贝构造函数,编译器就不会再提供默认构造函数和拷贝构造函数

析构函数
1)在类销毁的时候调用,执行一些空间回收之类的操作
2)无参数,无返回值,不可重载
3)在类销毁的时候执行一次

深拷贝与浅拷贝
浅拷贝:简单的将属性赋值给新创建的对象,但是这样会造成一个问题。如果类在堆空间中开辟了新的内存,浅拷贝只是将内存的地址赋值给新创建的类,在新创建的类执行析构函数的时候,会将已经释放的内存再次释放一次,为未定义行为。

深拷贝:编译器不提供,类申请堆区的空间必须使用深拷贝函数。同时也必须自己编写析构函数释放空间。

class Person(){private:
int m_age;
int *m_height;
Person(int age,int height){m_age = age;
*m_height = new int(height)
}//有参构造函数
~Person(){delete m_height;
}//我这种写法会有什么问题,如果不判断指针是否为空的时候就用delete
//delete会自动判断原来的指针是否为空
~Person(){if(m_height != nullptr){delete m_height;
m_height = nullptr;//防止野指针
}
};
void test01(){Person p0(18,160);Person p1(p0);//浅拷贝,在本来应该在堆空间中为p1额外开辟一个空间,但是只是简单的将p0所分配到的空间的地址拷贝给了p1//释放p0的时候会释放空间,然后释放p1的时候会再次释放同样的空间,会导致程序崩溃。
}

解决方法:自己设计一个拷贝构造

Person(const Person& p0){m_age = p0.m_age;
m_height = new int(*p0.m_height);
//m_height = p0.m_height;这个是在编译器为程序设计的默认构造函数中的写法

构造函数——初始化列表
语法:类():属性1(值1),属性2(值2){ }

class Person{int m_age;
int m_weight;
int m_height;
};
Person(int a, int b,int c):m_age(a),m_weight(b),m_height(c){};
//通过初始化列表将列表来初始化

c++类的成员可以是一个类的对象,此时,构造的时候,先构造其他类的对象(作为成员),再构造此类的对象(作为类的主体)

静态成员和静态成员函数
静态成员函数:
1)所有类的实例化共享同一个函数
2)两种访问方式;①通过类名进行访问,②通过实例进行访问
3)静态成员函数只能访问静态成员变量(因为静态成员变量是共享的,而非静态成员变量是每个函数独有的,每个函数拥有的都不一样,不知道访问哪一个变量。)
问题:可以在静态成员函数内定义静态变量吗?
为什么不可以?(使用vscode显示了编译通过)
4)同样具有访问权限,默认权限为private

class Person(){static int a;
static func(){cout << " " << endl;
a = 100;}
};
int main(){Person::func();//通过类来访问
Person p1;
p1.func();//通过类名进行访问

静态成员变量
1)所有对象共享同一份数据
2)类内声明,类外访问(这个是真的不太懂)
(猜测是因为在每个程序中,每个都共享同一份数据,所以要在类外初始化,在类内初始化有指明的对象)
3)在编译阶段分配内存

空间分配
c++中当类的对象为空的时候(既无属性,也无成员函数)此时也会分配一个独一无二的字节的内存,为了区分对象所占用的空间位置

成员变量和成员函数分开存储,
计算类所占空间的大小的时候,成员变量所占据的空间为非静态成员变量的大小。
所有的实例共享成员函数,
那么如何区分是哪个具体的实例调用成员函数呢?
this指针就指向调用函数的特定实例。
this指针指向非静态成员函数内的一种指针,
(那静态成员怎么办)

空指针访问对象

class Person{int m_height;
void f1(){cout << "talk is cheap.show me the code." << endl;}
void f2(){m_height = 100;//本质上是this->height
}
};
int main(void){Person *p = NULL;//
p->f1();//这个是能够运行成功的,因为函数f1()中没有成员属性
p->f2();//这个是错误的,因为p是一个空指针,此时其成为了f2()中的this指针,但是这个this指针应该是没有指向的,与有指向的那一部分(this->height)矛盾,会造成程序崩溃
//修改方法
void f2(){if(this == NULL)
return ;
m_height = 100;
}
//加一个对于this指针是否为空的检验
}

常函数和常对象
1)在成员函数后面加上const为常函数。
(理解,this可以当作一个常量指针,保证其指向的运行的对象不变,再加上一个const表示其指向的对象不可修改,
const * const this )
2)常函数不能修改成员属性,多用于返回只读属性

常对象
1)常对象只能调用常函数

2021-08-07黑马c++基础知识——类相关推荐

  1. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  2. 计算机基础知识思考doxc,2021第1章计算机基础知识.docx

    第 1 章 计算机基础知识 本章主要内容包括: 计算机的概述 计算机系统的基本组成 键盘的使用和指法 计算机安全 1.1计算机的概述 1.1.1计算机的发展简史 1 ?计算机的概念 计算机是一种能够自 ...

  3. php 类名 属性6,php基础知识(类中属性和方法练习)--2018年9月6日14:01:15

    实例 echo " 类的申明与实例化 "; class test1 { public function hello(){ return "我是一个类"; } } ...

  4. ABAP基础知识 类的例外处理

    一 前言 在类方法中处理业务逻辑时,对于异常情况需要中断类定义或者类方法的执行.同时这些异常情况还需要被调用点捕获,以便报错或者进入例外处理逻辑. 如果没有捕获这些错误,则会产生SHORT DUMP. ...

  5. 基础知识——类和文件和异常(六)

    基础点 子类初始化父类:super().__init__(make, model, year)中的参数都是父类中init函数的参数 子类重写父类方法:同名即可 文件打开路径:windows下是 \, ...

  6. 公务员考试中的计算机知识点,2021年度公务员考试计算机基础知识试题.doc

    互联设备中Hub称为___集线器_. A.网卡 B.网桥 C.服务器 D.集线器 Internet网是当前世界上第一大互联网,它来源于美国,其雏形是___ARPANET网_. A.NCFC网 B.CE ...

  7. 【计算机网络 22】基础知识总结

    一.TCP/IP协议概述 在TCP/IP协议栈,传输层有两个协议TCP和UDP TCP(Transmission Control Protocol,传输控制协议)协议:负责将要传输的文件分段 进行传输 ...

  8. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  9. 2021年5月信息系统项目管理师真题基础知识1~32题

    摘要:2021年5月信息系统项目管理师真题基础知识1~32题,视频解析可找科科过官网右侧联系方式获取. 1.[科科过]国家信息化体系包括六个要素,其中(1)信息化体系六要素中的龙头,是国家信息化建设的 ...

最新文章

  1. 一文读懂因果推断的起源
  2. IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?
  3. java空间租用_java影片租赁平台
  4. 【转】最牛B的编码套路
  5. windows 串口编程 c语言,windows下C语言版串口发送程序(基于VS2017)
  6. 搜狗浏览器热搜怎么关 热搜关闭方法详解
  7. java大数输出一位小数_java大数练习 大明A+B(大数小数的高精度)
  8. android文件体系,Android文件体系-基础
  9. DPDK笔记 RSS(receive side scaling)网卡分流机制
  10. 将object类型转换成时间,如果能转的话。
  11. Error in loadNamespace(name) : there is no package called ‘yaml’
  12. [转]让你的网页文本框增加光晕效果与提示,水印(类似QQ2011)
  13. Python笔记 | 角谷猜想
  14. Python套壳ImageMagick实现图片格式批量转换
  15. 在 UUP dump 被墙的情况下如何用 UUP 下载 ISO 镜像
  16. 安卓系统遥控器的映射具体过程相关文档
  17. python 利用random生成验证码与MD5码加密过程
  18. 还记得刚毕业那会的少年模样吗,肖遥与大家分享
  19. 南通市住房公积金管理中心集成容灾软件部分goldengate
  20. netstat成昨日黄花,SS和IP命令接力?

热门文章

  1. 树脂材料激光打标原理
  2. vivaldi浏览器_Vivaldi 1.0版本:您的新默认浏览器?
  3. Arduino实现光控灯
  4. 安卓google市场和Appstore查看下载量
  5. Linux设置swap分区为128g,linux增加swap空间的方法小结
  6. Forest一款轻量级HTTP客户端框架
  7. word2016加载endnote
  8. armbian设置_基于Armbian大变身!仅需10分钟 Phicomm N1 变身千元SIP电话呼叫中心!...
  9. android微信数据库密码,android微信sqlite数据库密码简单获得获得
  10. 回流焊机T962维修