首页 > 编程语言 >C++入门基础(类和对象)

C++入门基础(类和对象)

时间:2024-09-06 20:53:11浏览次数:6  
标签:初始化 入门 对象 成员 C++ 函数 data 构造函数

7.类和对象

1.面向对象和面向过程的区别

面向对象:是将事务抽象成类和对象,以对象为中心,通过对象的交互实现程序的功能 , 可维护性强

面向过程: 是将复杂问题一步步拆分,通过依次执行来解决问题 , 可维护性比较弱

2.类大小的计算

1.内存对齐

考虑内存对齐的默认大小 vs默认是 8字节 对齐是默认对齐数 和 数据类型的最小值 对齐可以使用 #pragma pack(n)来调整对齐数

   #include <stdio.h>

   #pragma pack(4) //对齐数为4
   struct MyStruct {
       char a;
       int b;
   };
   #pragma pack()

   int main() {
       printf("Size of MyStruct: %d\n", sizeof(struct MyStruct));
       return 0;
   }

也可以是用alignas 关键字进行修改

	alignas(16) int b;

变量 b 将按照 16 字节对齐。

2.空类

空类大小会被编译器设置为1字节大小

主要是保证每一个实例的独一无二的地址,如果空类的地址为0,那么多个空类对象地址会出现重叠,就会无法导致正确区分这些类

3.class和struct

class默认权限是private struct默认权限是public

class默认继承权限是private struct默认继承权限是public

class用来定于复杂的数据类型

struct用于数据类型的聚合

4.this指针

this指针是隐藏在非静态成员函数的特殊指针类型,它指向正在调用的该成员函数的对象实例

可以用来区别成员变量 和 局部变量 可以用this->加上成员变量名

this一般是隐式传递的 也可以取地址拿到this指针地址,也可以delete this 但是一般不推荐很危险

如果在析构函数中调用delete this 会造成无线递归死循环析构

5.8个默认成员函数

1.构造和析构
1.构造函数

在创建出实例对象的时候会自动调用构造函数对其成员变量进行初始化,初始化分为列表初始化,和函数体初始化

列表初始化是在分配内存时就进行初始化,函数体初始化是在分配完内存后再进行赋值初始化

如果没有显式的写出构造函数,编译器会生成默认的构造函数

2.析构函数

在delete对象时会先调用析构函数进行申请的内存释放

同上如果没有显式析构函数会生成默认的析构函数

2.拷贝构造和赋值
1.拷贝构造

拷贝构造是特殊的成员函数,用于把一个已有的同类对象去对一个创建的新对象进行初始化操作

class MyClass {
public:
    MyClass(const MyClass& other);  // 拷贝构造函数的声明
    // 其他成员函数和数据成员
};

默认情况下编译器生成的是浅拷贝,只是简单的值复制,会造成资源重复释放的问题,会报错

一般情况下我们需要自定义拷贝构造不仅复制值还要复制指针所指向的内容,确保每个对象有独立的空间

   class DeepCopyExample {
   public:
       int* data;
       DeepCopyExample(int value) {
           data = new int(value);
       }
       // 自定义的拷贝构造函数(深拷贝)
       DeepCopyExample(const DeepCopyExample& other) {
           data = new int(*other.data);
       }
       ~DeepCopyExample() {
           delete data;
       }
   };
2.赋值

赋值通常是通过重载operator = 将一个已有的对象赋值给另一个已有的同类型对象

3.移动构造和移动赋值
1.移动构造

通过move()移动语义 将其转换成一个将亡值 移动构造参数为一个右值引用将其接受,是一种高效的资源转移手段

**调用时机 ** – 放一个临时对象被用于初始化另一个同类型对象时,编译器会优先调用移动构造函数,如果定义了的话

ResourceHolder createResourceHolder() {
    return ResourceHolder();
}

int main() {
    ResourceHolder obj1;
    obj1 = createResourceHolder(); // 这里可能调用移动赋值运算符,如果定义了的话;如果没有定义移动赋值运算符但有移动构造函数,可能会先调用移动构造函数创建一个临时对象,然后调用拷贝赋值运算符(如果定义了)或默认的拷贝赋值运算符。

    ResourceHolder obj2(std::move(obj1)); // 显式调用移动构造函数,将 obj1 的资源转移到 obj2
    return 0;
}
2.移动赋值

移动赋值和移动构造类似都是资源高效的一种资源转移的手段

调用时机 当使用一个右值进行赋值的时候会调用移动赋值

   class ResourceHolder {
   public:
       int* data;

       // 移动赋值运算符
       ResourceHolder& operator=(ResourceHolder&& other) {
           if (this!= &other) {
               delete data;  // 释放当前对象原有的资源
               data = other.data;  // 窃取源对象的资源
               other.data = nullptr;  // 将源对象置为可安全销毁状态
           }
           return *this;
       }
   };
4.初始化列表
1.特性是什么?

初始化列表是在构造函数后面的 的 :后面进行初始化 初始化顺序是按声明顺序进行初始化的不是按初始化列表初始化的 ; 在对象调用构造函数初始化分配内存的时候,就同时初始化,而函数体初始化是在分配完成后在进行赋值初始化;效率上是比较高的

2.哪些成员必须在初始化列表进行初始化?

const成员变量 和引用必须初始化 一个是常量 一个是别名 比如进行初始化

3.初始化顺序是按声明顺序
5.运算符重载
1.哪些运算符不能重载

一些原来没有的运算符不能重载我们不能自己造一个运算符出来重载

2.和函数重载有什么区别

函数重载是通过参数列表不同进行重载 ,运算符重载需要通过operator关键字进行重载

3.他的意义是什么

运算符重载主要是能让我们对自定义类型像内置类型一样进行+ - * 等运算

6.友元
1.友元类

友元类是一种特殊的类关系设定,允许一个类访问另一个类的保护成员和私有成员,只需要在内类声明友元类就行,就好像是自己的成员一样访问;

同样也是用friend关键字修饰就行

class ClassB; // 前置声明

class ClassA {
private:
    int privateDataA;
public:
    ClassA();
    // 将 ClassB 声明为友元类
    friend class ClassB;
};

class ClassB {
public:
    ClassB();
    void accessClassA(ClassA& obj);
};

可以增强代码的复用,提高代码的执行效率,但同时也破坏了封装可以直接通过友元类进行私有成员的访问,可能会导致数据的不安全等因素;

2.友元函数

友元函数是一种特殊的非成员函数,通过friend关键字修饰可以访问类的保护成员和私有成员

class Myclass
{
public:
	Myclass();
	friend void friendFunction(Myclass& obj); //友元函数
private:
	int privateData;
};

增强了可访问行可以外部访问内部,但是同时也破坏了封装性,增加了代码的耦合度

7.static成员

static成员函数

static成员函数属于类不属于对象,没有this指针,不能访问其他类成员函数和成员变量,只能访问static成员函数和静态数据成员 , 只能通过类名::进行访问 , 同样也具有隐藏性;

可以用于实现单例

   class Singleton {
   private:
       static Singleton* instance;
       Singleton() {
           // 私有构造函数,防止外部直接实例化
       }
   public:
       static Singleton* getInstance() {
           if (instance == nullptr) {
               instance = new Singleton();
           }
           return instance;
       }
   };

   Singleton* Singleton::instance = nullptr;

static数据成员

静态数据成员所有对象共享一个数据成员 需要在类外进行初始化,静态数据成员在程序开始运行时就分配内存空间一般在静态区和全局变量一样 ;主要分为初始化 和 未初始化 , 初始化一般在.data 区 未初始化会被初始化为0 存在.bss区 ,生命周期伴随整个程序,只在当前文件可见 具有隐藏性

8.对象拷贝时编译器优化

主要是减少拷贝不用去创建临时对象,而是直接在用户调用栈进行对象创建

   class MyClass {
   public:
       MyClass(int a) : data(a) {}
       MyClass(const MyClass& other) : data(other.data) {
           std::cout << "Copy constructor called." << std::endl;
       }
       int data;
   };

   MyClass createObject(int value) {
       MyClass obj(value);
       return obj;
   }

在没有返回值优化的情况下会现在函数内部创建一个临时对象,然后从临时对象拷贝到调用栈,在有返回值优化的情况下时直接在调用栈进行对象的创建省去拷贝过程

标签:初始化,入门,对象,成员,C++,函数,data,构造函数
From: https://blog.csdn.net/qq_31786089/article/details/141969011

相关文章

  • C++入门基础
    6.C++入门基础1.函数重载1.什么是函数重载函数重载是实现C++多态的一个重要技术,是在同一作用域内相同函数名因为参数的类型不同或者个数不同或者都不同构成重载2.C++是如何支持函数重载的1.命名改变根据对应的参数类名改成比如voidfoo(int)voidfoo(double)_fo......
  • AI产品经理:零经验转行AI产品经理:从入门到精通的全面指南
    本篇文章来自于一个YouTube视频的内容,对于如何成为AI产品是一个很好的入门贴,这篇文章也是通过AI协助编辑过来的。通过这次编辑,也初步尝试了各大Chatbot的能力,总体体验,拥有长上下文能力的kimibot的体验最好,能将4000+字的英文完整翻译并进行初步的排版。但是通过这个......
  • scala入门基础(1)
    一。思维导图   二。案例案例1.分别使用val和var定义一个变量name使用val同时声明多个变量。操作步骤:(1)打开Windows命令控制台,输入scala并按【Enter】键,进入Scala的解释器。(2)使用val定义一个变量name。输入valname="scala"并按【Enter】键,可以看到变量定义成功......
  • 数列分块入门
    分块是一种优秀的思想。“数据”是分块的目的。不同于大多数树形数据结构,分块中访问数据是容易的,因此,它可以用比前者更简单的方式支持复杂的操作。“标记”是分块最重要的过程。不同于大多数树形数据结构,分块大多数时候不需要支持标记与标记合并,因此,它能完成一些前者不能完成的......
  • JavaScript学习文档(14):深入对象、内置构造函数、综合案例
    目录一、深入对象1、创建对象三种方式2、构造函数(1)构造函数(2)说明:(3)利用构造函数创建多个对象(4)实例化执行过程3、实例成员和静态成员(1)实例成员:(2)静态成员:二、内置构造函数1、Object2、Array(1)数组常见实例方法-核心方法(2)员工涨薪计算成本案例(3)还有些数组常见方法(4......
  • D20 kubernetes 工作负载资源对象-Deployment
    1、Deployment简介 Deployment是kubernetes中最常用的工作负载资源,具有以下特点和功能-副本管理:确保指定数量的pod副本在集群中运行。如果pod副本数小于期望值,则会自动创建pod;如果pod的副本数多余期望值,则删除多余的pod-滚动更新:采用滚动更新策略,逐步进行新旧版本pod的替换......
  • Modern C++——使用分支预测优化代码性能
    大纲[[likely]][[unlikely]]样例应用场景题外参考代码参考资料在C++20中,新引入了一对属性关键字[[likely]]和[[unlikely]],它们用于为编译器提供关于代码分支执行概率的额外信息,以帮助编译器进行更好的优化。这对属性是基于长期实践中开发人员对程序执行路径的深入理解......
  • 枚举: C++和Python实现鸡兔同笼问题
    作者制作不易,关注、点赞、收藏一下吧!目录1.Python实现2.C++实现1.Python实现首先,我们需要输入头和脚的数量:head=int(input("请输入头的数量:"))feet=int(input("请输入脚的数量:"))input()实现输入,int()实现把字符串型(str)换为整型(int)。然后,进行循环......
  • 面向对象开发重点摘要【软件设计师】
    文章目录前言一、面向对象基础1.1基本概念1.2面向对象开发流程二、UML2.1UML图的概念及分类2.2UML中的关系三、设计模式3.1设计模式分类汇总3.2创建型模式3.3结构型模式3.4行为型模式前言本文是在备考软考-软件设计师时编写的,为了记忆重点内容,内容较为简略,只是粗......
  • VBA之Excel应用第三章第一节:对象的层次结构
    《VBA之Excel应用》(版权10178983)是非常经典的,是我推出的第七套教程,定位于初级,目前是第一版修订。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可以非常容易的掌握相关的知识,这套教程共三册,十七章,都是我们在利用EXCEL工作过程中需要掌握的知识点,希望大家......