gpt4 book ai didi

c++ - (C++)如果我在一个类中声明了一些私有(private)的东西,但它可以通过类的公共(public)方法改变,那我为什么要声明它私有(private)?

转载 作者:太空狗 更新时间:2023-10-29 23:39:21 25 4
gpt4 key购买 nike

我创建了一个新的类分数,因为输入分子和分母是常识。学长建议我私下申报分子和分母。但是,如果它们可以更改并且无论如何都可能发生数据滥用,那么我为什么要将它们声明为私有(private)?

我的分数类代码(如果你想引用我的代码):

#ifndef FRACTION_H
#define FRACTION_H
#endif // FRACTION_H

#include<string>
#include<iostream>
using namespace std;

class fraction{
int numer, denom;
void change_to_simplest_form();
void get_value_in_string();
public:
fraction(int,int);
fraction(){numer =0; denom =0;}
void display();
int get_num(){return numer;}
int get_denom(){return denom;}
float get_float_num(){return float(numer);}
float get_float_denom(){return float(denom);}
void get_it_all_done();
inline bool operator<(fraction &rhs){if(float(this->get_float_num()/this->get_float_denom())<float(rhs.get_float_num()/rhs.get_float_denom()))return true; else return false;}
inline bool operator>(fraction &rhs){if(float(this->get_float_num()/this->get_float_denom())>float(rhs.get_float_num()/rhs.get_float_denom()))return true; else return false;}
inline bool operator<=(fraction &rhs){if(float(this->get_float_num()/this->get_float_denom())<=float(rhs.get_float_num()/rhs.get_float_denom()))return true; else return false;}
inline bool operator>=(fraction &rhs){if(float(this->get_float_num()/this->get_float_denom())>=float(rhs.get_float_num()/rhs.get_float_denom()))return true; else return false;}
inline bool operator==(fraction &rhs){if(float(this->get_float_num()/this->get_float_denom())==float(rhs.get_float_num()/rhs.get_float_denom()))return true; else return false;}
inline void operator++(int){numer+=denom;}
inline void operator+=(int a){numer+=(denom*a);}
inline void operator--(int){numer-=denom;}
inline void operator-=(int a){numer-=(denom*a);}
inline void operator=(string a){bool denom_not_one = true;int i =0;numer=0;denom=0;for(i =0;a[i]!='/';++i){if(a[i]=='\0'){denom=1;denom_not_one=false;break;}if(int(a[i])>=48 && int(a[i])<=57){numer*=10;if(a[i]!='0'){numer+=(int(a[i]-48));}}}for(;a[i]!='\0' && denom_not_one;++i){if(int(a[i])>=48 && int(a[i])<=57){denom*=10;if(a[i]!='0'){denom+=(int(a[i]-48));}}}}
inline void operator=(fraction &rhs){this->numer=rhs.get_num();this->denom=rhs.get_denom();}
inline fraction operator*(fraction &rhs){fraction tmp(this->numer*rhs.get_num(),this->denom*rhs.get_denom()); return tmp;}
inline void operator*=(fraction &rhs){this->numer*=rhs.get_num();this->denom*=rhs.get_denom();}
inline void operator/=(fraction &rhs){this->numer*=rhs.get_denom();this->denom*=rhs.get_num();}
};
void fraction:: get_it_all_done(){
change_to_simplest_form();
}

fraction::fraction(int a, int b){
denom = b;
numer =a;
// display();
}

void fraction::change_to_simplest_form(){
int divisor = 1;
bool islessthanzero = false;
if(numer<0){
numer*=(-1);
islessthanzero = true;
}
while(divisor <= numer && divisor <= denom){
if(numer%divisor==0){
if(denom%divisor==0){
numer/=divisor;
denom/=divisor;
}
}

divisor++;
}
if(islessthanzero){numer*=(-1);}
}

void fraction::display(){
change_to_simplest_form();
cout << "(" << numer << "/" << denom << ")" ;
}



std::ostream &operator<<(std::ostream &os,fraction &m){
m.get_it_all_done();

if(m.get_denom()!=1){
cout << "(" << m.get_num() << "/" << m.get_denom() << ")" ;

}
else cout << m.get_num();
return os;
}

最佳答案

这是private data - public interface的思想和原则,据此,用于更改任何私有(private)字段的公共(public)方法具有适当和适当的防御措施来防止更改私有(private)字段到程序中不需要的值(即避免破坏任何 invariants )。如果该字段只是public,那么就不会有这样的防御措施。

关于c++ - (C++)如果我在一个类中声明了一些私有(private)的东西,但它可以通过类的公共(public)方法改变,那我为什么要声明它私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com