struct X
{
X():mem(42){}
void f(int param = mem) //ERROR
{
//do something
}
private:
int mem;
};
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一个原因,为什么这在C++中是非法的?!也就是说,我知道这是一个错误,我知道错误意味着什么,我只是无法理解为什么这是非法的!
如何在C++中获取成员函数的绝对地址?(我需要这个用于thunking.)
成员函数指针不起作用,因为我无法将它们转换为绝对地址(void *) - 我需要知道内存中实际函数的地址,而不仅仅是相对于类型的地址.
我想声明成员函数签名的类型定义.全局函数typedef如下所示:
typedef int (function_signature)(int, int);
typedef int (*function_pointer) (int, int);
Run Code Online (Sandbox Code Playgroud)
但是我对成员函数不能做同样的事情:
typedef int (foo::memberf_signature)(int, int); // memberf_pointer is not a member of foo
typedef int (foo::*memberf_pointer)(int, int);
Run Code Online (Sandbox Code Playgroud)
这对我来说听起来很合理,因为"foo ::"是访问类foo中成员的语法.我怎样才能输入签名?
当我们在c ++中为类创建一个成员函数时,它有一个隐式的额外参数,它是一个指向调用对象的指针 - 被称为this.
对于任何函数都是如此,即使它不使用this指针也是如此.例如,给定班级
class foo
{
private:
int bar;
public:
int get_one()
{
return 1; // Not using `this`
}
int get_bar()
{
return this->bar; // Using `this`
}
}
Run Code Online (Sandbox Code Playgroud)
两个函数(get_one和get_bar)都将this作为隐式参数,即使其中只有一个实际使用它吗?
这样做似乎有点浪费.
注意:我理解正确的做法是做get_one()静态,答案可能取决于实现,但我只是好奇.
在[dcl.attr.depend]/1中,我读到:
属性[...]
carries_dependency[...]可以被应用到declarator-id的parameter-declaration在函数声明或λ,在这种情况下,它SPECI音响上课该参数的初始化携带依赖性(1.10)的每个左值到右值该对象的转换(4.1).该属性也可以应用于declarator-id函数声明,在这种情况下,它指定返回值(如果有的话)对函数调用表达式的求值具有依赖性.
我缺少的是一种将属性应用于隐式this参数的方法.
举例来说,考虑这个免费功能:
void fun(int i, Foo * [[carries_dependency]] f);
Run Code Online (Sandbox Code Playgroud)
它等同于(但对于属性)成员版本:
void Foo::fun(int i); // can't add [[carries_dependency]] here?
Run Code Online (Sandbox Code Playgroud) 我正在使用Stroustrup(Programming Principles&Practice Using C++)一书学习C++.在练习中,我们定义了一个简单的结构:
template<typename T>
struct S {
explicit S(T v):val{v} { };
T& get();
const T& get() const;
void set(T v);
void read_val(T& v);
T& operator=(const T& t); // deep copy assignment
private:
T val;
};
Run Code Online (Sandbox Code Playgroud)
然后我们要求定义一个const和一个非const成员函数来获取val.
我想知道:有任何情况下get,返回非const 函数是否有意义val?
对我来说似乎更清洁,我们无法间接改变这种情况下的价值.在需要const和非const get函数返回成员变量的情况下可能会出现什么情况?
假设我们想通过以下方式声明const成员函数typedef:
typedef int FC() const;
typedef int F();
struct A
{
FC fc; // fine, we have 'int fc() const'
const F fc; // not fine, 'const' is ignored, so we have 'int fc()'
};
Run Code Online (Sandbox Code Playgroud)
由于const被忽略,程序编译得很好.为什么const忽略功能?既然我们可以用这种方式形成const指针,我唯一能想到的就是"C传承".标准是否对此有所说明?
只是想整理一个程序,并想知道是否有人可以在同一行上多次调用一个队列上的成员函数给我一些语法糖.
例如,更改:
queue<int> q;
q.push(0);
q.push(1);
Run Code Online (Sandbox Code Playgroud)
类似于:
q.(push(0), push(1));
//or
q.push(0).push(1);
Run Code Online (Sandbox Code Playgroud)
我知道它看起来有点荒谬,并不实用.但是,如果我想缩短这样的一小部分代码,是否可以选择这样做?从我到目前为止所读到的内容来看,只有在函数具有非void返回值时才能链接方法.
当然,这是一个选项:
q.push(0); q.push(1);
Run Code Online (Sandbox Code Playgroud)
但我试图避免在q那里两次.再次......语法糖:)
这里的目标不是初始化,而是压缩对象/容器在代码块中生成的次数.我引用队列的原因是因为它是动态的.
c++ member-functions syntactic-sugar function-calls method-chaining
我对Python比较陌生,并且努力将语言的特性与我从C++和Java背景中学到的习惯相协调.
我最近的问题与封装有关,特别是Meyer的" Effective C++ " 第23项总结的一个想法:
friend暂时忽略缺少机制,非成员函数也被认为优于Python中的成员函数吗?
一个强制的,asinine的例子:
class Vector(object):
def __init__(self, dX, dY):
self.dX = dX
self.dY = dY
def __str__(self):
return "->(" + str(self.dX) + ", " + str(self.dY) + ")"
def scale(self, scalar):
self.dX *= scalar
self.dY *= scalar
def scale(vector, scalar):
vector.dX *= scalar
vector.dY *= scalar
Run Code Online (Sandbox Code Playgroud)
鉴于v = Vector(10, 20),我们现在可以调用v.scale(2)或scale(v, 2)加倍向量的大小.
考虑到我们在这种情况下使用属性的事实,两个选项中的哪一个 - 如果有的话 - 更好,为什么?
我可以轻松地将成员函数绑定到a std::function带有capture子句的lambda表达式.
class Class
{
Class()
{
Register([=](int n){ Function(n); });
}
void Register(std::function<void(int)> Callback)
{
}
void Function(int Number)
{
}
};
Run Code Online (Sandbox Code Playgroud)
但我想直接绑定它们,如下所示.
// ...
Register(&Class::Function);
// ...
Run Code Online (Sandbox Code Playgroud)
我认为根据C++ 11标准,这应该得到支持.但是,在Visual Studio 11中,我收到了这些编译器错误.
错误C2440:'换行':无法从'int'转换为'Class*'
错误C2647:'.*':无法在'int'上取消引用'void(__thiscall Class ::*)(int)'
member-functions ×10
c++ ×9
c++11 ×2
const ×2
typedef ×2
getter ×1
performance ×1
python ×1
std-function ×1
this ×1
visual-c++ ×1