首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c++更改另一个类中的对象值

在C++中,要更改另一个类中的对象值,可以使用成员函数或友元函数来实现。

  1. 成员函数:如果要在一个类中更改另一个类的对象值,可以在该类中定义一个成员函数,并将另一个类的对象作为参数传递给该函数。在函数内部,可以通过对象的引用或指针来访问和修改对象的成员变量。

例如,假设有两个类A和B,我们想要在类A中更改类B的对象值:

代码语言:txt
复制
class B {
private:
    int value;
public:
    B(int val) : value(val) {}
    int getValue() const { return value; }
    void setValue(int val) { value = val; }
};

class A {
public:
    void changeBValue(B& obj, int newVal) {
        obj.setValue(newVal);
    }
};

int main() {
    B bObj(10);
    A aObj;
    aObj.changeBValue(bObj, 20);
    cout << bObj.getValue();  // 输出 20
    return 0;
}

在上面的例子中,类A中的成员函数changeBValue接受一个类B的对象引用和一个新的值作为参数。在函数内部,通过调用类B的成员函数setValue来修改对象的值。

  1. 友元函数:如果两个类之间有较为复杂的关系,或者需要直接访问对方的私有成员,可以使用友元函数来实现。友元函数是在一个类中声明的,在另一个类中定义的非成员函数,它可以访问该类的私有成员。

例如,假设有两个类A和B,我们想要在类A中更改类B的对象值:

代码语言:txt
复制
class B;

class A {
public:
    void changeBValue(B& obj, int newVal);
};

class B {
private:
    int value;
public:
    B(int val) : value(val) {}
    int getValue() const { return value; }
    friend void A::changeBValue(B& obj, int newVal);
};

void A::changeBValue(B& obj, int newVal) {
    obj.value = newVal;
}

int main() {
    B bObj(10);
    A aObj;
    aObj.changeBValue(bObj, 20);
    cout << bObj.getValue();  // 输出 20
    return 0;
}

在上面的例子中,类A中的成员函数changeBValue被声明为类B的友元函数。这样,在函数内部就可以直接访问类B的私有成员value并进行修改。

需要注意的是,以上示例仅为演示目的,实际应用中可能需要更多的错误处理和安全性考虑。此外,腾讯云并没有与C++相关的特定产品或链接地址,因此无法提供相关推荐。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】————对象

如果一个什么成员都没有,简称为空。空什么都没有吗?...,保证每个函数都有一个初始,并且在对象生命周期内只调用一次。...如果类没有显式定义构造函数,则 C++ 编译器会自动生成一个无参默认构造函数,一旦用户显式定义编译器将不再生成。...2、无参数返回 3、一个有且只有一个析构函数,如果没有,系统会默认生成析构函数 4、对象生命周期结束时,编译器会自动调用析构函数。...二、赋值运算符重载 2.1运算符重载: 在C++,为了增加代码可读性增加了运算符重载,运算符重载是具有特殊函数名函数,也具有返回类型,函数名字以及参数序列,其返回与参数列表与普通函数类似

10810

C++对象

⽆返回。 (返回啥都不需要给,也不需要写void,不要纠结,C++规定如此) 3. 对象实例化时系统会⾃动调⽤对应构造函数。 4. 构造函数可以重载。 5....如果类没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参默认构造函数,⼀旦⽤⼾显式定义编译器将不再⽣成。 6....赋值运算符重载 5.1运算符重载 • 当运算符被⽤于类型对象时,C++语⾔允许我们通过运算符重载形式指定新含义。...C++规定类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应运算符重载,则会编译报错。...• const实际修饰该成员函数隐含this指针,表明在该成员函数不能对任何成员进⾏修改。

6910
  • C++对象

    日期实现 7. const成员 8. 取地址及const取地址操作符重载 ---- 1. 6个默认成员函数 如果一个什么成员都没有,简称为空真的什么都没有吗?...构造函数是一个特殊成员函数,名字与名相同,创建类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适初始,并且在对象整个生命周期内只调用一次。...4.2 特性 构造函数是特殊成员函数,需要注意是,构造函数虽然名称叫构造,但是构造函数主要任务并不是开空间创建对象,而是初始化对象! 其特征如下: 1. 函数名与名相同。 2. 无返回。...注意:C++11 针对内置类型成员不初始化缺陷,又打了补丁,即:内置类型成员变量在 声明时可以给默认。...5.赋值运算符重载 5.1 运算符重载 C++为了增强代码可读性引入了运算符重载,运算符重载是具有特殊函数名函数,也具有其返回类型,函数名字以及参数列表,其返回类型与参数列表与普通函数类似 函数名字为

    1.2K20

    C++对象

    ---- 前言 祖师爷在设计 C++ 时,规定每个中都有六个默认成员函数,即使我们不主动写,编译器也会自动生成,这些成员函数就是神秘天选之子,不仅神秘,而且还很强大,可以这么说:对象是否学懂...,将内置类型给上缺省,调用编译器生成默认构造函数时,就会以这些缺省来初始化成员变量,达到初始化效果 注意:此时给是缺省,并非在声明阶段赋值,成员变量为声明阶段 class Date {...,规则也都差不多 析构函数创建规则: 函数名在前面加上~ 也没有返回,连 void 都不需要写 对象声明周期结束时,编译器会自动调用默认析构函数 析构函数不支持重载,毕竟不能对同一个对象销毁多次...+中新关键字,operator 作用很简单,实现自定义类型运算 使用规则: operator 函数操作数取决于参数个数 operator 一般写在,方便通过 this 指针访问成员变量 写在时...一但对象涉及动态内存开辟,必须自己实现深度拷贝 ️注意事项 拷贝构造 和 赋值重载存在本质区别,一个是对象尚未实例化,另一个是两个对象都已存在 当两个对象都被创建,并发生赋值行为时,才叫做赋值重载

    22510

    对象C++

    看看以下实例加深印象: 内置类型(基本类型)和⾃定义类型 C++类型分为 内置类型(基本类型)和⾃定义类型 。...⼀个局部域多个对象C++规定后定义先析构。...C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,所以这⾥⾃定义类型传传参和传返回都会调⽤拷⻉构造完成。 4. 若未显式定义拷⻉构造,编译器会⽣成⾃动⽣成拷⻉构造函数。...4.赋值运算符重载 4.1运算符重载 1.当运算符被⽤于 类型对象时 (使用范围) ,C++语⾔允许我们通过 运算符重载形式指定新含义。...C++规定类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应运算符重载,则会编译报错。

    8510

    c++对象

    而在c++编译器会自动为生成6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成成员函数称为默认成员函数。...2.构造函数 2.1概念 构造函数是一个特殊成员函数,名字与名相同,创建类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适初始,并且在对象整个生命周期内只调用一次。...构造函数是特殊成员函数,主要任务并不是开 空间创建对象,而是初始化对象。 如果在并没有显示定译构造函数,编译器会默认生成一个 无参默认构造函数。...4.2常见拷贝构造函数调用场景 使用已存在对象创建新对象 函数参数类型为类型对象 函数返回类型为类型对象 class Date { public: Date(int year, int...5.运算符重载函数 C++为了增强代码可读性引入了运算符重载,运算符重载是具有特殊函数名函数,也具有其返回类型,函数名字以及参数列表,其返回类型与参数列表与普通函数类似。

    14710

    C++对象()

    如果一个什么成员都没有,简称为空。空什么都没有吗?并不是的,任何一个在我们不写情况下,都会自动生成下面 6个默认成员函数。 在这个地方,对于这6个默认成员函数,前面四个是比较重要。...构造函数是一个特殊成员函数,名字与名相同,创建类型对象时由编译器自动调用,保证每个数据成员都有 一个合适初始,并且在对象生命周期内只调用一次 特性 构造函数是特殊成员函数,需要注意是,...赋值重载(复制拷贝) 已经存在两个对象之间拷贝 拷贝构造(初始化) 一个初始化另一个马上要创建对象 赋值运算符主要有五点: 参数类型(如上const Date& d) 返回 (如上Date...但是如果写在全局,又引发了另一个问题: 如何去访问私有属性❓ 1.直接把私有权限改为公共权限 2.在设置get和set方法,然后在外直接调用即可 3.友元声明 同时,全局变量/全局函数在所有文件...至此,内容比较多了,我们先到这里结束掉我们对象()内容

    1.2K30

    C++初阶-对象

    C++对象渐入之章 一、前言 二、6个默认成员函数汇总 三、构造函数 四、析构函数 五、拷贝构造函数 六、赋值运算符重载 1、运算符重载 2、赋值运算符重载 七、日期实现 八、const成员...九、取地址及const取地址操作符重载 一、前言 本章是继C++对象启点之章后续,进一步深入学习掌握C++对象 二、6个默认成员函数汇总 对于任何一个来说,在我们不主动写默认成员函数时...,并且在对象生命周期内只调用一次 特性: 函数名必须和名一致 无返回(没有返回并不是void,void返回是空) 对象实例化时编译器自动调用对应构造函数(在C语言上优化...) 特性: 析构函数名是在名前加上字符 ~ 无参数无返回 一个有且只有一个析构函数,若未显式定义,系统会自动生成默认析构函数(不能重载) 对象生命周期结束时,C++...,如果一个对象对这空间进行释放,而另一个对象却依旧保存着该地址(野指针),如果进行操作该空间(再次free等)则会造成程序崩溃 六、赋值运算符重载 1、运算符重载 引入: C++为了增强代码可读性引入了运算符重载

    61220

    C++对象)--下篇

    五、赋值运算符重载 1、运算符重载 运算符重载是具有特殊函数名函数,是C++为了增强代码可读性而引入 operator sign(parameter); operator为关键字,sign就是需要重载运算符符号...,内置成员直接赋值,自定义成员需要调用对应赋值运算符重载完成赋值 (4)有了拷贝我们就一定要说说深拷贝,在Date这样不需要我们自己实现,而在Stack这样中就需要显式实现,进行资源管理...,所以在生成s2时,s2指针a指向数组与s1指针指向数组相同,在程序结束时,调用析构函数释放了s2,对应这块数组空间也被释放,然后调用析构函数释放s1,已经被释放空间不能被再次释放,所以出现了这样错误...const成员函数,const实际修饰其中隐含this指针,表明在该成员函数不能对任何成员进行修改 因为参数为隐藏,所以我们方法如下: void Date::Print() const {...const成员函数 非const对象能调用const成员函数 const成员函数内不能调用其他非const成员函数 非const成员函数内能调用其他const成员函数 七、日期实现 Date.h #

    12410

    C++ 初阶 对象()

    妈妈再也不用当心我忘记初始化了~ 1.2构造函数特性 1. 无返回。 2.函数名与名相同。 3. 对象实例化时编译器自动调用对应构造函数。 4. 构造函数可以重载。...先来讲一下第一点,无返回,这里无返回是包括void,也就是连void都不用,直接写构造函数名就行了,这时候我们就会接触到第二点,函数名与名相同,比方说我们要创建一个关于日期,我给这个取名为...但必须要注意一点则是,在C++,编译器会对自定义类型调用它默认构造函数,而不对内置类型进行处理。...因此在C++,就诞生了一个函数,它就是析构函数,它能够令对应出了它生命域便销毁,从而保证了安全性。 2.析构函数特性 1. 析构函数名是在名前加上字符 ~。 2....无参数无返回类型。 3. 一若未显式定义,系统会自动生成默认析构函数。注意:析构函数不能重载 4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

    14910

    C++初阶】—— 对象 (

    ,代码可以通过编译,因为编译器生成了一个无参默认构造函数 将Date构造函数放开,代码编译失败,因为一旦我们自己定义任何构造函数,编译器将不再生成 C++11 针对内置类型成员不初始化缺陷做出了改变...,内置类型成员变量在声明时可以给默认。...不实现构造函数,默认构造初始化对象将会是随机,看起来好像默认构造一无是处!真的是这样吗? C++把类型分成内置类型和自定义类型。...若未显式定义,系统会自动生成默认析构函数 对象生命周期结束时,C++编译系统系统自动调用析构函数 整体上来说,析构函数就是反向构造函数其大部分特征都类似,编译器自动生成默认析构函数也只处理自定义类型...: 使用已存在对象创建新对象 函数参数类型为类型对象 函数返回类型为类型对象 四.

    7210

    C++对象)【下篇】

    赋值运算符重载 运算符重载 当运算符被⽤于类型对象时,C++语⾔允许我们通过运算符重载形式指定新含义。...C++规定类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应运算符重载,则会编译报错。 运算符重载是具有特殊名字函数,他名字是由operator和后⾯要定义运算符共同构成。...有返回,且建议写成当前类型引⽤,引⽤返回可以提⾼效率,有返回是为了⽀持连续赋值场景。...const实际修饰该成员函数隐含this指针指向内容,表明在该成员函数不能对任何成员进⾏修改。...除⾮⼀些很特殊场景,⽐如我们不想让别⼈取到当前对象地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址。 一个是取普通对象地址,一个是取const修饰对象地址。

    9410

    C++对象)--上篇

    一、六个默认成员函数 如果有个什么成员都没有,那么被称为空 由编译器自动生成成员函数称为默认成员函数 空中会自动生成六个默认成员函数,这六个默认成员函数在每个中都会自动生成 ①初始化功能构造函数...②清理功能析构函数 ③使用同类对象初始化创建对象拷贝构造 ④把一个对象赋值给另一个对象赋值重载 ⑤对普通对象取地址重载 ⑥对const对象取地址重载 这六个默认成员函数主要将操作对象分为内置类型和自定义类型...、构造函数特性 构造函数是特殊成员函数,主要任务就是初始化对象 (1)函数名与名相同 (2)无返回 (3)对象实例化时编译器自动调用 (4)可以重载 class Date { public...对象,所以编译器会调用Date析构函数,编译器默认生成析构函数可以对自定义成员Time调用它析构函数,即当Date销毁时,Time也会销毁 如果类没有申请资源时,也就是没有在堆上申请空间时,...: 已存在对象建立新对象 函数参数为类型对象 函数返回类型对象 class Date { public: Date(int year, int month, int day) { cout

    7010

    C++对象对象引入

    2.引入 C语言结构体只能定义变量,在C++,结构体内不仅可以定义变量,也可以定义函数。...Person这个定义出了man这个实例才可以进行后续一系列操作 ; 7.对象模型 7.1对象存储方式猜测 对象包含各个成员 缺陷:每个对象成员变量是不同,但是调用同一份函数...C++通过引入this指针解决该问题 即:C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数this,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量”操作...所以对象不存储this指针; this指针是“成员函数”第一个隐含指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递; 9.结语 C++通过可以将数据以及操作数据方法进行完美结合...以上就是C++对象上篇所有内容啦~ 完结撒花 ~

    14710

    C++初阶路】--- 对象()

    有这样一个问题: Date中有InitDate与 PrintDate两个成员函数,函数体没有关于不同对象区分,那当d1调用 InitDate函数时,该函数是如何知道应该设置d1对象,而不是设置d2...C++通过引入this指针解决该问题,即:C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量”操作,都是通过该指针去访问...构造函数是一个特殊成员函数,名字与名相同,创建类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适初始,并且在对象整个生命周期内只调用一次。...3.2 特性 构造函数是特殊成员函数,需要注意是,构造函数虽然名称叫构造,但是构造函数主要任务并不是开空间创建对象,而是初始化对象。 其特征如下: 函数名与名相同。 无返回。...自定义类型既是内置类型和自定义类型(可无)组合,最后还是需要我们来初始化! 注意:C++11 针对内置类型成员不初始化缺陷,又打了补丁,即:内置类型成员变量在声明时可以给默认

    11710

    手撕C++对象

    但是栈是需要析构函数,因为栈有资源需要清理 对于日期的话,我们是不需要进行内存释放 但是我们可以一些小操作 在对象声明周期最后我们可以让对象进行一系列操作,反正声明周期之后会自动调...return 0; //} /* 日期一般是不需要析构函数 但是栈是需要析构函数,因为栈有资源需要清理 对于日期的话,我们是不需要进行内存释放 但是我们可以一些小操作 在对象声明周期最后我们可以让对象进行一系列操作...,就是无穷递归 C++规定:类型传参必须调用拷贝构造 内置类型可以用系统默认浅拷贝,我们没必要自己写 5....赋值运算符重载 运算符重载 • 当运算符被⽤于类型对象时,C++语⾔允许我们通过运算符重载形式指定新含义。...拷贝构造是将一个已经存在对象拷贝初始化给另一个要创建对象 而赋值运算符重载是两个已经存在对象,一个对象将他拷贝赋值给另一个对象 operator= 赋值运算符重载具体使用说明以及注意事项

    10110

    C++初阶】对象修炼

    一.构造函数 首先给大家聊聊为什么C++要设计出构造函数,构造函数完成对象初始化Init(),因为在实际代码编写过程,我们往往会忘记写对象初始化函数Init(),甚至还会出现写了忘记调用情形...,这造成影响就是成员变量还是天生随机,对于比如栈这种对象,带有指针,如果指向内存一块随机地址,就会出现非法访问内存大问题哦。...,又打了补丁,即:内置类型成员变量在 声明时可以给默认。...比如实现两个日期对象相加,将运算结果存到另一个对象,因为运算符重载存在,代码可以通俗易懂成这样: Date d1(2022,1,1); Date d2(2022,12,31); Date d3...对于不同,每一种实例化出来多个对象之间可能不能比较对象大小,比如带有字符串;但是几乎大部分实例化出来对象都是支持对象之间相互赋值,所以C++就把赋值运算符重载加到了六大默认成员函数

    52850

    初识C++ · 对象()(2)

    1 赋值运算符重载 1.1运算符重载 在学习赋值运算符重载之前,我们先来介绍一下运算符重载: C++为了增加代码可读性,引用了运算符重载概念,运算符重载其实就是一个特殊一点点函数,返回,参数,...其中,返回,返回类型等都是根据实际情况操作,比如日期减日期,返回类型是int,因为返回是相差天数,比如日期减天数,返回就是日期,因为返回就是日期,所以实际返回返回类型参数等都是看实际情况...,在C++可以直接进行比较就是内置类型,但是自定义类型不可以直接比较,这个时候就需要用到运算符重载了,用法如: bool operator==(Date d1, Date d2) { return...答案是不行,因为全局重载函数要访问的话,成员变量一定要是公有的,不然就会报错: C++提供了三个解决方法: 1 提供这些成员get和set 2 使用友元 3 重载成成员函数 这里着重介绍是重载成成员函数...这段代码本意是:创建一个日期d,再用一个日期引用来接受这个日期

    9210

    初识C++ · 对象()(1)

    ,我们会发现编译器会自动进入到Time构造函数,随即初始化Time三个内置类型为0,但是如果Time我们没有显式定义构造函数呢?...那么就会: 那么Time内置类型成员都会是随机,有点类似无限套娃,只要我们没有显式定义构造函数,就会被定义为随机,是不是看起来很鸡肋?...先不着急,C++11标准为了给内置成员初始化,添加了一个补丁,即可以在声明时候给上缺省: class Date { public: void Print() { cout << _year...3 析构函数 构造函数是用来初始化,那么析构函数就是用来做类似销毁工作,但是不是对对象本身进行销毁,对象本身是局部变量,局部变量进行销毁是编译器完成,析构函数是用来进行对象资源清理。...这是因为在传调用时候,形参也是一个对象对象之间赋值都会涉及到拷贝构造函数调用,我们结合以下代码: class Date { public: Date(int year,int month,int

    7710

    初识C++·对象()(3)

    1 流重载 C语言中printf和scanf是有局限性,只能直接打印内置类型,对于自定义类型就哦豁了,所以在C++中就引用了流概念,也就是cou cin: 为什么说打印输出时候不需要占位符,这就是因为流就是一个重载了函数...,所以每次打印时候都会调用对应重载函数,比如多次打印时候,printf一下就打印出来了,但是对于流不行,它要调用许多次重载函数,才能打印出,这也就导致了C++效率不如C语言高,对于不同类型,都可以进行打印...,那么我们显式实现一下流重载: 首先我们要知道cout和cin来源于io流,作为一个全局对象出现,所以cin类型是istream,cout是ostream,所以我们有一个参数类型一定是ostream...这个其实和连续赋值是一样,所以我们只需要加上返回: ostream& operator<<(ostream& out, const Date& d)//流重载 { out << d....比如返回地址时候,我想整蛊一下别人呢,比如我返回空,返回假地址,当然平时不用显式定义,默认生成就够用了。 对象中就结束了,终于结束了,挺多, 感谢阅读!

    5710
    领券