首页 > 其他分享 >const在类和函数之间的运用

const在类和函数之间的运用

时间:2024-04-15 18:11:06浏览次数:16  
标签:const 函数 two char cstr 运用 data String

const在类和函数之间的运用

第一种情况简单来说就是如果声明了一个const类但是调用了非const的方法.那么编译会不通过 -> const类只能调用const方法,非const类就都可以调用

示例代码:

宏定义:

#pragma
#ifndef __CONST_OBJECT__
#define __CONST_OBJECT__

#include <iostream>
#include <string.h>

using namespace std;

class String
{
public:
String(const char* cstr = 0);
~String();
char* get_data() const { return m_data; }
void print() const { cout << "hello world!" << endl; };
private:
char* m_data;
};

inline String::String(const char* cstr) {
if (cstr)
{
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else
{
m_data = new char[1];
*m_data = '\0';
}
}

inline String::~String() {
delete[] m_data;
}

class String_two
{
public:
String_two(const char* cstr);
~String_two();
char* get_two_char() const { return m_two_data; }
void print();
private:
char* m_two_data;
};

inline String_two::String_two(const char* cstr) {
if (cstr)
{
/* 开辟内存空间 */
m_two_data = new char[strlen(cstr) + 1];
strcpy(m_two_data, cstr);
}
else
{
/* 开辟一块放置空字符的内存空间 */
m_two_data = new char[1];
*m_two_data = '\0'; // 字符指针直接指向空字符
}
}

inline String_two::~String_two() {
delete[] m_two_data;
}

void String_two::print() {
cout << "HelloWorld!!!" << endl;
}

#endif // !__CONST_OBJECT__

调用函数:

#include "const_object.hpp"

int main() {
String s("say_good");
String_two st("say_hello");

s.print(); // 因为s当中的print声明成了const.所以这一行会编译通过
st.print(); // 因为st当中的print没有声明成const,所以这一行会编译不通过

return 0;
}

Copy On Write(COW)

主要用来考虑操作符是否需要进行赋值的操作

示例代码:

String operator[] (size_type pos) const { }

上述的方法当中声明了操作符[],被定义成了const,那么就不可以通过str[0] = 'H'的方式进行赋值,所以在方法当中不需要考虑赋值的实现

示例代码two:

String& operator[] (size_type pos) { }

上述方法没有将操作符[]声明成const,那么就可以进行类似str[0] = 'H'的赋值操作,所以在方法当中需要考虑赋值的实现

上述提到非const对象也可以调用const函数,那么如何区分const函数是被什么调用的呢?

  • c++编译器规定:当成员函数因为关键字const签名不同而被重载的时候

    • const对象只能调用const函数

    • const对象只能调用非const函数

这就是const的另一种使用方式

标签:const,函数,two,char,cstr,运用,data,String
From: https://www.cnblogs.com/JunkingBoy/p/18136644

相关文章

  • JS 中的函数式 - 常用概念
    一、柯里化-currying柯里化的意思是将一个多元函数,转换成一个依次调用的单元函数,用表达式表示: f(a,b,c)→f(a)(b)(c)  核心代码实现:exportfunctioncurry(fn){letlen=fn.length;//收集目标函数的参数个数(总)returnfunctioncurriedFn(...params){......
  • 在 C 中定义函数 - 如何定义 C 中的函数
    在C编程中,函数扮演着基本的角色。它们使您能够编写组织良好且易于维护的代码。在本文中,您将学习在C中定义函数的基础知识。(本文视频讲解:java567.com)C中的函数是什么?在编程中,函数是执行特定任务的代码块。函数接受输入,处理它们,执行操作,并产生输出。函数很重要,因为它们组......
  • C++_内存模型和函数以及类
    C++内存模型函数函数与编译器类成员变量class内部通过 static修饰变量时,表示该变量为静态成员变量,必须在类外定义 staticconst修饰变量时,表示该变量为静态成员常量,可以在类内初始化,或者在类外初始化 staticconstexpr修饰变量时,表示该......
  • 函数对象,闭包函数及装饰器了解
    函数对象【1】定义函数对象指的是函数可以被当做数据来处理【2】可以直接被引用定义一个函数用一个新的变量名来存,用新的变量名来调用#定义一个函数defadd(x,y):returnx+y#将函数地址绑定给一个变量func=add#通过这个变量找到对应的地址,从而调用函数res......
  • hash()函数在python2和python3的区别
    在Python3中,对于字符串类型的对象,hash()函数会根据当前进程的种子值计算哈希值。这个种子值在每次Python进程启动时都会随机生成。因此,即使是相同的字符串,在不同的Python进程中调用hash()函数会得到不同的哈希值。这种设计的目的是为了增加哈希表的随机性,从而提高安全性......
  • 析构函数与 -O2 优化的一个问题
    在赋值时,我们需要先对原有对象调用析构函数。我的析构函数实现如下:~vector() { for(ptr*itr=begin_p;itr!=finish_p;itr++) { delete*itr; } delete[]begin_p; begin_p=nullptr;finish_p=nullptr;end_p=nullptr; }不使用-O2优化,程序运行正常,调用完析构函......
  • PHP strlen() 和mb_strlen()函数
    <?php   //测试时文件的编码方式要是UTF8   $str='中文a字1符';   echostrlen($str).'<br>';//14   echomb_strlen($str,'utf8').'<br>';//6   echomb_strlen($str,'gbk').'<br>';//8   echomb_s......
  • python-函数以及函数的返回值
    '''函数:把具有独立功能的代码块组合成一个个小模块作用:提高代码的效率,实现代码重复---流程标准化#可以在不同的地方多次调用,想要使用几次就使用几次,更加灵活,只需要调用,不需要重新定义'''#def函数名():#函数的定义#函数名需要复合标志符的命名规范(必须是字母,下划线,数......
  • 定义存储过程和函数
    定义存储过程和函数本文出处:https://www.modb.pro/db/222642学习地址https://www.modb.pro/course/133学习目标学习openGauss定义存储过程和函数课后作业1.创建带有入参和出参的函数1,调用函数时使用按参数值传递和命名标记法传参omm=#createfunctionfunc_multiply(......
  • 函数式编程思想 VS 可变性理论 20240415
    函数式编程(FunctionalProgramming,FP)是一种编程范式,它将计算视为数学函数的求值,并避免使用程序状态以及易变对象。函数式编程的核心思想包括:不可变性(Immutability):在函数式编程中,数据是不变的。一旦创建了一个数据结构,就不能再改变它。所有的操作都会产生新的数据结构。纯......