有人可以解释在Python中对象名称之前有前导下划线的确切含义吗?另外,解释单个和双重前导下划线之间的区别.此外,无论所讨论的对象是变量,函数,方法等,这个含义是否保持不变?
在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo.我myFoo偶尔也见过.
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo.这是否允许C++标准?
以下代码(包含恶意错误)在没有任何警告的情况下编译GCC.但是,当然,它不像开发人员(我)那样工作.
#include <iostream>
struct A
{
bool b;
void set(bool b_) { this->b = b_; }
bool get() const { return this-b; } // The bug is here: '-' instead of '->'
};
int main()
{
A a;
a.set(true);
std::cout << a.get() << std::endl; // Print 1
a.set(false);
std::cout << a.get() << std::endl; // Print 1 too...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以为编译器添加哪个警告(GCC 4.8)以避免这种错误?
链接问题:是否有任何强制(或警告)访问成员变量/函数的选项this->?
这个问题是一个在问的赞助这个线程.
使用以下类定义:
template <class T>
class Foo {
public:
Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
{
/* do something for foo */
}
T Foo_T; // either a TypeA or a TypeB - TBD
foo_arg_t _foo_arg;
};
template <class T>
class Bar : public Foo<T> {
public:
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
Foo<T>::Foo_T = T(a_arg);
}
Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
: Foo<T>(bar_arg)
{
Foo<T>::Foo_T = T(b_arg);
} …Run Code Online (Sandbox Code Playgroud) C++ 03中的标识符是否允许使用美元符号?在C++ 03中不允许使用标识符中的美元符号.GCC将其作为C扩展提供,并在C++ 03模式下正确地提供诊断.但是,在C++ 11中,int $ = 0将在没有警告的情况下编译.
这个答案的原因$可能是允许的,因为实现定义的标识符不需要诊断:
这里的答案是"可能":根据§2.11,标识符可以由数字和标识符 - 非数字组成,从后者之一开始.标识符非数字是通常的
a-z,A-Z并强调,除了因为C++ 11它们包括 通用字符-名称(例如\uBEAF,\UC0FFEE32),和其他执行定义的字符.因此,如果$允许在标识符中使用,则它是实现定义的.VC10及以上版本也支持早期版本.它甚至支持标识符?????.但是:我不会用它们.使标识符尽可能可读和可移植.
$是实现定义的,因此不可移植.
这种语言也存在于C++ 03标准中,因此我认为这不是一个非常令人信服的论点.
§2.10/ 2
此外,一些标识符保留供C++实现和标准库(17.6.4.3.2)使用,否则不得使用; 无需诊断.
标准中的哪些更改允许$用作标识符名称?
考虑以下课程:
class A
{
A();
int number;
void setNumber(int number);
};
Run Code Online (Sandbox Code Playgroud)
您可以通过3种方式实现'setNumber':
方法1:使用'this'指针.
void A::setNumber(int number)
{
this->number = number;
}
Run Code Online (Sandbox Code Playgroud)
方法2:使用范围解析运算符.
void A::setNumber(int number)
{
A::number = number;
}
Run Code Online (Sandbox Code Playgroud)
方法3:相反,用'm'或'_'表示所有成员变量(这是我的首选方法).
void A::setNumber(int number)
{
mNumber = number;
}
Run Code Online (Sandbox Code Playgroud)
这只是个人偏好,还是选择特定方法有好处?
我最近花了很多时间使用javascript,现在又回到了C++.当我从一个方法访问一个类成员时,我倾向于为它添加前缀this->.
class Foo {
int _bar;
public:
/* ... */
void setBar(int bar) {
this->_bar = bar;
// as opposed to
_bar = bar;
}
}
Run Code Online (Sandbox Code Playgroud)
在阅读时,它在试图找出它来自何处时为我节省了大脑周期.
我有什么理由不这样做吗?
在使用实例成员时,我总是明确地使用我的代码,在它们前面this.加上静态成员,并在前面添加类型名称.
罗斯林似乎不喜欢这一点,并礼貌地建议你可以省略this.,并Type.从你的代码在适当情况下...
......所以我会这样做... (没有双关语意)
public void DoSomethingCool()
{
this.CallAwesomeMethod();
CoolCucumber.DoSomethingLessAewsome();
}
Run Code Online (Sandbox Code Playgroud)
... roslyn建议我这样做......
public void DoSomethingCool()
{
CallAwesomeMethod();
DoSomethingLessAwesome();
}
Run Code Online (Sandbox Code Playgroud)
...但是当谈到使用扩展方法时,似乎我不能省略this.例如...... 的使用
public int GetTotal()
{
// This doesn't work
return Sum(o => o.Value);
// This does
return this.Sum(o => o.Value);
}
Run Code Online (Sandbox Code Playgroud)
问题:
this.和Type.?this.用于扩展方法?this.和Type.和了StyleCop的分析仪坚持,我使用它们?好吧我不是一个非常有经验的C++程序员,但我想知道下面的构造函数的参数中下划线的意义是什么?
class floatCoords
{
public:
floatCoords(float _x, float _y, float _width, float _height)
: x(_x), y(_y), width(_width), height(_height)
{
}
float x, y, width, height;
...
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用Win32/MFC框架和使用Visual Studio 2010的C++编程语言的应用程序.
我的问题是哪个命名约定需要用于变量,函数名,类名等.我听说微软建议使用"匈牙利表示法"命名约定.
能告诉我哪个标准可以使用吗?
它被认为是好的还是坏的做法?我的一位朋友告诉我,一般来说,现在大多数语言都不被认为是好习惯,但是他认为他听说这不是fortran的情况.这是真的?如果是真的,为什么?
c++ ×8
identifier ×2
scope ×2
.net ×1
arguments ×1
c# ×1
c#-6.0 ×1
c++-faq ×1
c++11 ×1
class ×1
constructor ×1
fortran ×1
gcc ×1
gcc-warning ×1
inheritance ×1
member ×1
mfc ×1
name-lookup ×1
python ×1
roslyn ×1
standards ×1
syntax ×1
templates ×1
variables ×1
winapi ×1