cpp_05_类_string类

1  类的定义

1.1   构造函数

        定义:函数名必须与类名相同,且没有返回值类型 ,连void也没有。

        构造函数调用时间:

        在定义对象的同时自动被调用,而且仅被调用一次

                1)对象定义语句

                2)new操作符

        构造函数的作用:

                1)设置  对象的初始状态:定义对象的各个成员变量赋初值

                2)执行  在对象定义之初想实现的任何操作 。

// clsobj1.cpp
// 构造函数:(1)函数名必须与类名相同 (2)没有返回值类型
// 构造函数被调用的时间:定义对象的同时,自动被调用
// 构造函数的作用:定义对象的各个成员变量(造包子馅)
#include <iostream>
#include <cstring>
using namespace std;
class Human {
public:
    Human( /* Human* this */ int age=0, const char* name="无名") {
        // 在this所指向的内存空间中 定义m_age(给m_age分配内存空间),初值随机数
        // 在this所指向的内存空间中 定义m_name(给m_name分配内存空间),初值随机数
        cout << "Human类的构造函数被调用" << endl;
        m_age = age;
        strcpy( m_name, name );
    }
//    void setinfo( /* Human* this */ int age=0, const char* name="无名" ) { 
//        this->m_age = age;
//        strcpy( this->m_name, name ); 
//    }
    void getinfo( /* Human* this */ ) { 
        cout << "姓名:" << this->m_name << ", 年龄:" << this->m_age << endl;
    }
private:    
    int m_age; // 声明
    char m_name[256]; // 声明 
};
// 以上代码模拟类的设计者(标准库的类,第三方提供的类,自己设计的类)
// ------------------------
// 以下代码模拟类的使用者
int main( void ) {
    Human h(22,"张飞"); // 定义h (给h分配内存空间),利用h.Human(22,"张飞")

    cout << "h对象创建完毕" << endl; 
//    h.setinfo( 22,"zhangfei" ); 
    h.getinfo(); 
    return 0;

1.2  对象的定义过程

        定义对象,就是

        1)给对象分配内存空间

        2)并利用对象调用构造函数

                        ①定义成员变量;

                        ②执行用户在构造函数中书写的代码。

        

2  类的实例化(定义对象)的11种方法

2.1  栈中,对象的定义和销毁

        在栈中,定义单个对象:

                01)类名  对象;    //注意不要加空括号,加了误导编译器:返回值类型 函数名 形参表

                02)类名  对象( 实参表 ); 

        在栈中,定义对象数组:

                03)类名  对象数组[ 元素个数 ]; 

                04)类名  对象数组[ 元素个数 ] = { 类名( 实参表 ), ... };    // 11)定义匿名对象,右值

                05)类名  对象数组[] = { 类名( 实参表 ), ...}; 

2.2  堆中,对象的定义和销毁

        不是所有的匿名对象生命周期都短暂:new出来的对象(下面讲到),基类子对象

        匿名的栈对象,生命周期短暂,语句级。

        

        在堆中,定义/销毁单个对象

                06)类名*  对象指针 = new  类名;  //定义相应类的堆对象,匿名对象。

                07)类名*  对象指针 = new  类名();  //这里可以加空括号,同06,异于01

                08)类名*  对象指针 = new  类名( 实参表 ); 

                        delete  对象指针;

        在堆中,定义/销毁对象数组

                09)类名*  对象数组指针 = new  类名[ 元素个数 ]; 

                10)类名* 对象数组指针 = new  类名[ 元素个数 ]{类名( 实参表 ), ...};     // 11标准

                        delete[]  对象数组指针;

// clsobj2.cpp 定义对象的11种方法
#include <iostream>
#include <cstring>
using namespace std;
class Human {
public:
    Human( /* Human* this */ int age=0, const char* name="无名") {
        // 在this所指向的内存空间中 定义m_age(给m_age分配内存空间),初值随机数
        // 在this所指向的内存空间中 定义m_name(给m_name分配内存空间),初值随机数
        cout << "Human类的构造函数被调用" << endl;
        m_age = age;
        strcpy( m_name, name );
    }
    void getinfo( /* Human* this */ ) { 
        cout << "姓名:" << this->m_name << ", 年龄:" << this->m_age << endl;
    }
private:    
    int m_age; // 声明
    char m_name[256]; // 声明 
};
// 以上代码模拟类的设计者(标准库的类,第三方提供的类,自己设计的类)
// ------------------------
// 以下代码模拟类的使用者
int main( void ) {
    Human(32,"马超").getinfo();

    Human h(22,"张飞"); // 定义h (给h分配内存空间),利用h.Human(22,"张飞")
    h.getinfo(); 

    Human h2; // 定义h2,利用h2.Human()
    h2.getinfo();

    Human h3[3]; // 定义了3个Human类对象,并分别利用这3个Human类对象.Human()
    for( int i=0; i<3; i++ ) {
        h3[i].getinfo();
    }

    Human h4[3] = { Human(22,"张飞"), Human(20,"赵云"), Human(25,"关羽") };
    for( int i=0; i<3; i++ ) {
        h4[i].getinfo();
    }

    Human h5[] = { Human(22,"张飞"), Human(20,"赵云"), Human(25,"关羽"), Human(45,"黄忠") };
    for( int i=0; i<sizeof(h5)/sizeof(h5[0]); i++ ) {
        h5[i].getinfo();
    }

    Human* ph = new Human; // 定义 Human类堆对象,利用 Human类堆对象.Human()
    (*ph).getinfo(); // ph->getinfo()
    delete ph;
    ph = NULL;

    Human* ph2 = new Human(); // 定义 Human类堆对象,利用 Human类堆对象.Human()
    (*ph2).getinfo();
    delete ph2;
    ph2 = NULL;

    Human* ph3 = new Human(18,"武松"); // 定义 Human类堆对象,利用 Human类堆对象.Human(18,"武松")
    (*ph3).getinfo();
    delete ph3;
    ph3 = NULL;

    Human*ph4 = new Human[3]; // 定义了 3个Human类堆对象,分别利用这3个Human类堆对象.Human()
    for( int i=0; i<3; i++ ) {
        ph4[i].getinfo();
    }
    delete[] ph4;
    ph4 = NULL;

    Human* ph5 = new Human[3]{ Human(18,"武松"), Human(19,"李逵"), Human(20,"鲁达") };
    for( int i=0; i<3; i++ ) {
        ph5[i].getinfo();
    }
    delete[] ph5;
    ph5 = NULL;

    return 0;
}

3  string类

        是C++标准库中的类,在操作字符串方面优于char*  []  :

                1)string类是c++类,而char* []的c痕迹明显;

                2)string类可直接 = 赋值/初始化,而char* []要用strcpy()。

3.1  string类的5种使用方法

        string  s1( "hello" );           //触发构造函数

        string  s2( s1 );                 // 等同于 string  s2 = s1;    触发构造函数

        string  s3;    s3 = s2;        // 触发拷贝复制函数调用

        string  s4 = "hello";          // 触发类型转换操作

        string  s5;    s5 = "hello";        // 触发类型转换操作

// string_pre.cpp C++标准库设计的string类
#include <iostream>
using namespace std;

// 模拟类的设计者(类库、别人设计的类、自己设计的类)
// --------------------------------
// 模拟用户(使用类的人)
int main( void ) {
    string s1("hello"); // s1维护的字符串为"hello"
    cout << "s1:" << s1 << endl;

    // 如果在做初始化,并且“=”两边类型完全一致,那么=xxx 和 (xxx) 无差别
    
    string s2(s1); // = s1; // s2维护的字符串 和 s1维护的字符串 内容相同 
    cout << "s2:" << s2 << endl;
    
    string s3; // s3维护的字符串为空串
    cout << "s3被赋值前:" << s3 << endl;
    s3 = s2; // s3维护的字符串 和 s2维护的字符串 内容相同
    cout << "s3被赋值后:" << s3 << endl;

    // 只要“=”两边类型不一致,编译器首先要做类型转换操作

    string s4 = "hello"; // s4维护的字符串内容为"hello"
    cout << "s4:" << s4 << endl;
    
    string s5; // s5维护的字符串为空串
    s5 = "hello"; // s5维护的字符串内容为 "hello"
    cout << "s5:" << s5 << endl;
    return 0;
}

 

3.2  string类的内部实现原理

//string.cpp
#include <iostream>
using namespace std;

// C++标准库设计的string类(类中有一个私有成员变量 char*m_psz-->指向一个字符串)

// 模拟类的设计者(类库、别人设计的类、自己设计的类)
// --------------------------------
// 模拟用户(使用类的人)
int main( void ) {
    string s1("hello"); // 定义s1,利用s1.string("hello")--->s1维护的字符串为"hello"
    cout << "s1:" << s1 << endl;

    // 如果在做初始化,并且“=”两边类型完全一致,那么=xxx 和 (xxx) 无差别
    
    string s2 =s1; //(s1) // 定义s2,利用s2.string(s1)--->s2维护的字符串 和 s1维护的字符串 内容相同 
    cout << "s2:" << s2 << endl;
    
    string s3; // 定义s3,利用s3.string()--->s3维护的字符串为空串
    cout << "s3被赋值前:" << s3 << endl;

    // 如果在做赋值,并且“=”两边类型完全一致,那么将触发 operator= 函数的调用
    s3 = s2; // s3.operator=(s2) --->s3维护的字符串 和 s2维护的字符串 内容相同
    cout << "s3被赋值后:" << s3 << endl;

    // 不管是初始化还是赋值,只要“=”两边类型不一致,编译器首先要做类型转换操作

    string s4 = "hello"; 
    // 定义 匿名string类对象,利用 匿名string类对象.string("hello")--->匿名string类对象维护的字符串为"hello"
    // string s4 = 匿名string类对象--->s4维护的字符串 和 匿名string类对象维护的字符串 内容相同
    // --->s4维护的字符串内容为"hello"
    //模式相当于s1 + s2
    cout << "s4:" << s4 << endl;
    
    string s5; // 定义s5,利用s5.string() --->s5维护的字符串为空串
    s5 = "hello"; 
    // 定义 匿名string类对象,利用 匿名string类对象.string("hello")--->匿名string类对象维护的字符串为"hello"
    // s5 = 匿名string类对象--->s5维护的字符串 和 匿名string类对象维护的字符串 内容相同
    //--->s5维护的字符串内容为 "hello"
    cout << "s5:" << s5 << endl;
    return 0;
}

// twoDimensional.cpp 设计一个二维坐标系的 类
#include <iostream>
using namespace std;

class TwoDimensional {
public:
    TwoDimensional( int x=0, int y=0 ) {
        // 在this指向的内存空间中 定义m_x初值为随机数
        // 在this指向的内存空间中 定义m_y初值为随机数
        m_x = x;
        m_y = y;
    }
    void getinfo( /* TwoDimensional* this */ ) { // 非常函数
        cout << "横坐标: " << m_x << ", 纵坐标: " << m_y << endl;
    }
private:
    int m_x; // 横坐标
    int m_y; // 纵坐标
};

int main( void ) {
    TwoDimensional a(100,300); // 定义a,利用a.TwoDimensional(100,300)
    a.getinfo( );

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[PyTorch][chapter 8][李宏毅深度学习][DNN 训练技巧]

前言&#xff1a; DNN 是神经网络的里面基础核心模型之一.这里面结合DNN 介绍一下如何解决 深度学习里面过拟合,欠拟合问题 目录&#xff1a; DNN 训练常见问题 过拟合处理 欠拟合处理 keras 项目 一 DNN 训练常见问题 我们在深度学习网络训练的时候经常会遇到下面…

算法(图网格)-岛屿问题-岛屿数量

岛屿数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以…

RabbitMQ入门指南(九):消费者可靠性

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消费者确认机制 二、失败重试机制 三、失败处理策略 四、业务幂等性 1.通过唯一标识符保证操作的幂等性 2.通过业务判断保证操作的幂等性 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系…

EasyExcel实现动态表头(注解实现)

要实现上述动态头&#xff0c;按每日统计&#xff0c;每月统计&#xff0c;每年统计。而时间是一直变化&#xff0c;所以我们需要表头也一直动态生成。 首先&#xff0c;我们需要定义所需要实体类 public class CountDayData {ExcelProperty(value "业务员姓名")p…

test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比

拓展阅读 test-01-java 单元测试框架 junit 入门介绍 test-02-java 单元测试框架 junit5 入门介绍 test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比 test assert-01-Google Truth 断言 test 系统学习-03-TestNG Spock testng 入门使用教程 开源…

第四周:机器学习知识点回顾

前言&#xff1a; 讲真&#xff0c;复习这块我是比较头大的&#xff0c;之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的&#xff0c;现在一想脑子里就剩下几个名词就觉得废柴一个了&#xff0c;朋友们有没有同感…

【华为OD机试真题2023CD卷 JAVAJS】开源项目热榜

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 开源项目热榜 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、…

IDEA 控制台中文出现乱码问题解决

一、问题概述 请看下图 二、问题分析 IDEA控制台输出乱码一般会有三种来源&#xff1a; ① IDEA本身编码错误 ② Tomcat日志输出编码错误 ③ 项目本身原因。 终极原因&#xff1a;IDEA编码和Tomcat编码不一致&#xff0c;统一设置为UTF-8即可。 三、解决思路 修改…

敏捷开发 - 知识普及

敏捷开发- Scrum 前言 知乎有一篇文章描写Scrum,我觉得比较好:https://zhuanlan.zhihu.com/p/631459977 简单科普下PM和PMO 原文来源:https://zhuanlan.zhihu.com/p/546820914 PM - 项目经理(Project Manager) ​ 需要具备以下能力 ​ 1.号召力 2.影响力 3.交流能力 4.应…

万用表测接地电阻方法

万用表测接地电阻方法 用万用表在不同土质的土壤对接地电阻进行了实验&#xff0c;并将万用表所测数据和专用接地电阻测试仪所测数据进行了比较&#xff0c;两者十分接近。具体测量方法如下&#xff1a; 找两根8mm、1m长的圆钢&#xff0c;将其一端磨尖作为辅助测试棒&#x…

熊猫目标检测数据集VOC格式200张

熊猫&#xff0c;又名大熊猫&#xff0c;是中国珍稀特有的保护动物&#xff0c;被誉为“国宝”&#xff0c;具有极高的观赏价值。它们生活在中国中部的山区&#xff0c;包括四川、甘肃和陕西等地。熊猫是一种大型的食草动物&#xff0c;主要以竹子为食&#xff0c;也偶尔进食其…

调用delay_ms函数进入hardfault_handler处理硬件错误中断

一、大多是情况下hardfault_handler处理硬件错误中断的解决办法 1.检查代码中是否有指针未初始化或者越界访问的情况。 2.检查是否有堆栈溢出的情况&#xff0c;可以通过增加堆栈大小或者减少函数调用深度来解决。 3.检查是否有中断优先级设置不当的情况&#xff0c;可以通过…

数据治理之主数据管理

文章目录 一、主数据管理概述什么是主数据什么是主数据管理主数据管理的意义打破孤岛&#xff0c; 提升数据质量统一认知&#xff0c; 提升业务效率集中管控&#xff0c; 提升管理效能数据驱动&#xff0c; 提升决策水平 二、主数据管理方法摸家底建体系接数据数据接入数据清洗…

Maven之插件入门

官方文档&#xff1a;https://maven.apache.org/guides/plugin/guide-java-plugin-development.html 命名规范 <yourplugin>-maven-plugin 创建项目 生成项目 方式一、IDEA 2023 方式二、命令行 mvn archetype:generate -DgroupIdcn.lsj -DartifactIdhello-maven-pl…

Redis Streams在Spring Boot中的应用:构建可靠的消息队列解决方案【redis实战 二】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis Streams在Spring Boot中的应用&#xff1a;构建可靠的消息队列解决方案 引言前言Redis Streams的基本概念和特性1. 日志数据结构2. 消息和字段3. 消费者组4. 消息ID5. 实时和历史数据处理6. 性能…

DVWA靶场中的xss-反射型xss、存储型xss的low、medium、high的详细通关方法

目录 1.DVWA反射型xss &#xff08;1&#xff09;Low&#xff1a; &#xff08;2&#xff09;Medium&#xff1a; &#xff08;3&#xff09;Heigh 2.xss存储型 &#xff08;1&#xff09;Low&#xff1a; &#xff08;2&#xff09;Medium &#xff08;3&#xff09;He…

词法语法语义分析程序设计及实现,包含出错提示和错误恢复

词法说明 (1)关键字 main, int, char, if, else, for, while, void (2)运算符 - * / < < > > ! (3)界符 ; ( ) { } (4)标识符 ID letter(letter|digit)* (5)整型常数 NUM digit digit* (6)空格 ‘ ‘ ‘\n’ ‘\r’ ‘\t’ 空格用来分隔ID,NUM,运算符,界…

idea自动注释

前言 保存一下自己的自动注释代码 idea自动注释 前言1 创建类时&#xff0c;自动生成注释2 在方法上使用快捷键生成注释3 使用方法4 效果图 1 创建类时&#xff0c;自动生成注释 如下&#xff1a; #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package …

亚马逊美国站ASTM F2613儿童折叠椅和凳子强制性安全标准

ASTM F2613折叠椅和凳子安全标准 美国消费品安全委员会&#xff08;CPSC&#xff09;发布的ASTM F2613儿童折叠椅和凳子的强制性安全标准&#xff0c;已于2020年7月6日生效&#xff0c;并被纳入联邦法规《16 CFR 1232儿童折叠椅和凳子安全标准》。 亚马逊要求在美国站上架的儿…

数据库基础面试第三弹

1. mysql数据库四种常见数据库引擎 1. MyISAM&#xff1a; MyISAM是MySQL最早的数据库引擎之一。它被设计成处理大量的插入和查询操作。MyISAM表格的数据存储在三个文件上&#xff1a;.frm文件存储表结构&#xff0c;.MYD文件存储数据&#xff0c;.MYI文件存储索引。MyISAM表…