在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo.我myFoo偶尔也见过.
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo.这是否允许C++标准?
关于C++中的访问器方法的几个问题已经被问到,但没有一个能够满足我对这个问题的好奇心.
我试图尽可能避免使用访问器,因为像Stroustrup和其他着名的程序员一样,我认为一个类很多都是OO的标志.在C++中,我可以在大多数情况下为类添加更多的责任或使用friend关键字来避免它们.但在某些情况下,您确实需要访问特定的班级成员.
有几种可能性:
1.根本不要使用存取器
我们可以公开相应的成员变量.这在Java中是不行的,但对于C++社区似乎没问题.但是,我有点担心的情况是一个显式副本或一个对象的只读(const)引用应该返回,是夸大了吗?
2.使用Java样式的get/set方法
我不确定它是否来自Java,但我的意思是:
int getAmount(); // Returns the amount
void setAmount(int amount); // Sets the amount
3.使用客观的C风格的get/set方法
这有点奇怪,但显然越来越普遍:
int amount(); // Returns the amount
void amount(int amount); // Sets the amount
为了使其工作,您必须为您的成员变量找到不同的名称.有些人附加下划线,其他人加上"m_".我也不喜欢.
你使用哪种风格?为什么?
我原来是来自C#的世界,我正在学习C++.我一直想知道在C++中获取和设置函数.在C#中,这些使用非常流行,而像Visual Studio这样的工具通过使它们变得非常容易和快速实现来促进使用.但是,在C++世界中似乎并非如此.
这是C#2.0代码:
public class Foo
{
    private string bar;
    public string Bar
    {
        get { return bar; }
        set { bar = value; }
    }
}
或者,在C#3.0中:
public class Foo { get; set; }
可能人们会说,那是什么意思呢?为什么不创建一个公共字段,然后在需要时将其变为属性; 老实说,我其实不确定.我只是出于好的做法,因为我已经看过很多次了.
现在因为我已经习惯了这样做,我觉得我应该把习惯延续到我的C++代码中,但这真的有必要吗?我没有像C#那样频繁地完成它.
无论如何,这是我收集的C++:
class Foo
{
public:
    std::string GetBar() const; // Thanks for the tip Earwicker.
    void SetBar(std::string bar);
private:
    std::string bar;
}
const std::string Foo::GetBar()
{
    return bar;
}
void Foo::SetBar(std::string bar)
{
    // Also, I always wonder if using 'this->' is good …在编写API或可重用对象时,是否存在任何技术原因导致返回'void'的所有方法调用不应仅返回'this'(*在C++中为此)?
例如,使用字符串类,我们可以做这样的事情:
string input= ...;
string.Join(input.TrimStart().TrimEnd().Split("|"), "-");
但我们不能这样做:
string.Join(input.TrimStart().TrimEnd().Split("|").Reverse(), "-");
..beause Array.Reverse()返回void.
还有许多其他示例,其中API具有许多返回void的操作,因此代码最终看起来像:
api.Method1();
api.Method2();
api.Method3();
..但完全有可能写:
api.Method1().Method2().Method3()
..如果API设计师允许这样做.
遵循这条路线有技术原因吗?或者它只是一种风格的东西,表示可变性/新对象?
(x-ref 关于返回虚空的文体问题)
结语
我已经接受了Luvieere的答案,因为我认为这最能代表意图/设计,但似乎有一些流行的API示例与此有所不同:
在C++中cout << setprecision(..) << number << setwidth(..) << othernumber;似乎改变了cout对象,以便修改插入的下一个数据.
在.NET中,Stack.Pop()并且Queue.Dequeue()都返回一个项目,但改变集合了.
向ChrisW和其他人道歉,详细了解实际的性能成本.
我有两个简单的类来处理3d几何Point和Vector.它们都有3个坐标作为公共成员变量,并定义了一些运算符+, -, * ....
class Point
{
public:
    double x, y, z;
    // ctor and some operators   
}
class Vector
{
public:
    double x, y, z;
    // ctor and some operators   
}
是否有任何反对让coordiantes公开的真正理由?我永远不会改变double任何其他类型.我不想将值限制在x, y, z特殊范围内,我不想在设置坐标时检查任何内容.
这些类位于一个库中,供其他项目使用.
更新:
 
对我来说,对于setter/getter来说,一个很大的不满就是必须像这样编写/读取代码:
myVec.setX(myVec.x() + 1.0);
代替
myVec.x += 1.0;
Upadate 2:
Qt在QPoint中使用getter/setter但没有任何好处
我对 C++ 类中的私有数据成员有点困惑。我是编码新手,仍然处于“课程”章节的中间,所以我可能领先于自己,但我觉得我错过了一条信息:
假设我有这个代码:
class clocktype;
{ 
  public:
          void setTime(int,int,int);
          .
          .
          .
   private:
          int hr;
          int min;
          int sec;
     };
我创建了一个对象 myclock。
clocktype myclock;
myclock::setTime(hour,minute,min)
{
  if (0<= hour && hour < 24)
  hr = hour;
  if (0<= minute && minute <60)
  min = minute;
  if ( 0<= second && second<60)
  sec = second;
 }
 myclock.setTime(5,24,54);
我的教科书说我不能这样做:
myclock.hr = 5;
因为hr是私有数据成员,对象myclock只能访问公共成员。但这实际上不是我在我的setTime功能中所做的吗?我了解我正在myclock.hr通过我的公共成员功能进行访问。但我仍在为这背后的逻辑而苦苦挣扎。那么成为私有数据成员意味着什么?
我来自ActionScript 3等语言的背景,我们有一种特殊的方法可以将成员变量定义为实例和设置/获取受保护或私有成员值的方法.让我举个例子:
在课堂上,我们可以这样说:
private var _myString:String;
public get myString():String 
{
    return _myString;
}
public set myString(newValue:String):void
{
    //Do some super secret member protection n' stuff
    _myString = newValue;
}
然后在该对象之外我可以执行以下操作:
trace(myClass.myString); //Output whatever _myString is. (note the lack of (). It's being accessed like property not a method...
更进一步,我可以做一些像删除"public set myString"方法的东西,所以如果有人试图用我的类做这个:
myClass.myString = "Something"; //Try to assign - again note the lack of ()
它会抛出一个错误,让用户知道该属性是以只读方式提供的.
既然我使用C++并且它比Actionscript 3更加出色,我想知道如何模仿这种行为.我不想使用一堆脏getVariable()和setVariable()方法.我希望通过一些操作符重载技巧我可以在这里完全相同的事情.注意我是菜鸟,所以请你这样说.:)
更新 我想最简单的解释方法是,我试图基本上有getter和setter但是通过赋值调用它们而不是用括号()来调用它们.
在Java中,代码约定简单明了,在这种风格中:
public:
    int GetMyAge(){
        return myAge;
    }
    void SetMyAge(int myAge){
        this->myAge = myAge;
    }
private:
    int myAge;
(我知道这是"同样的事情",但是)我已经阅读了大部分关于SO的相关问题,我仍然不知道用C++做"最好的"和"最官方的"方式.这不仅仅是一个偏好的问题,可以吗?
编辑:
好像它可以.
我想创建一个类/结构,其中一个属性在功能上依赖于其他属性。如何做到这一点?
struct Numbers {
  int a;
  int b;
  int c; // c == a+b
}
Numbers n1 {1, 2, 3}; // Ok.
Numbers n2 {1, 2, 4}; // Error! 
在我的用例a, b, c中,如果这很重要(因此const int可以使用),则是恒定的。
所有属性都会在 class/struct 方法中多次出现,因此目标是缓存 value a+b。以加法为例,依赖函数可能更复杂。
c++ ×9
c# ×2
accessor ×1
api ×1
attributes ×1
c++-faq ×1
class ×1
coding-style ×1
getter ×1
members ×1
private ×1
properties ×1
reflection ×1
setter ×1
standards ×1
struct ×1