我想知道如何在 python 中初始化一个对象,只使用命名的 args,如果可能的话。

如果self.name = name 和self.age = age 的顺序互换,则错误在于初始化age。我将这些作为关键字参数提供给对象,那为什么还不够呢?我看到一个类深入 python 实例化,使用显式命名的关键字参数和它们的默认值(文件名=无),所以我认为 **kwargs 也可以工作。谢谢
Foo(Foo&& other) {
this->bar = other.bar;
other.bar = nullptr;
}
Foo(Foo* other) {
this->bar = other->bar;
other->bar = nullptr;
}
Run Code Online (Sandbox Code Playgroud)
上面两个似乎只是在做同样的事情。那么为什么推荐使用移动构造函数呢?它提供了哪些优势?
我有一个有用的函数,我想将它从独立实用程序转换为 RAII 样式的帮助程序类。我对类的定义进行得很顺利,直到我粘贴函数代码并重命名它。此时函数名用红色下划线标出,工具提示说“与其类同名的成员函数必须是构造函数”。
此错误消息没有帮助。我知道我不能编写与类同名的函数。我希望这个函数是一个构造函数。为什么不是?这是怎么回事?
前:
void Useful( int Param ) // works, and is useful
{
// do useful things
}
Run Code Online (Sandbox Code Playgroud)
后:
class Useful
{
void Useful( int Param ) // generates error
{
// do useful things
}
};
Run Code Online (Sandbox Code Playgroud) 他们为什么要用?顺便说一下,我是初学者.我理解初始化值的默认构造函数,因为它具有逻辑意义,但为什么使用带参数的构造函数来表示实例变量age例如等于a.什么目的?没有它,只有初始化构造函数会发生什么?这里提出的其他问题没有意义,例如:
public class MyCats {
private int age;
private String name;
public MyCats(int a, String n) { // why do I need this?
age = a;
name = n;
}
public MyCats() {
age = 0;
name = "";
}
}
Run Code Online (Sandbox Code Playgroud) 由于继承的类没有默认的构造函数,因此我显式调用了继承的类的构造函数,而在的构造函数上我仍然得到了红色下划线(在VScode中) B:
类“ A”不存在默认构造函数
类是否A必须获取默认构造函数?有没有什么办法解决这一问题?
这是简化的代码:
class A
{
public:
int a_;
A(int a): a_(a)
{}
};
class B: public A
{
public:
A A1;
A A2;
B(int a1, int a2): A1(a1), A2(a2)
{}
};
Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的课程:
public class SampleClass
{
const string UnChangableUserName { get; private set; }
string Password { get; private set; }
public SampleClass(string UnChangableUserName, string Password)
{
this.Password = Password;
this.UnChangableUserName = UnChangableUserName;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望构造函数为const分配一个值,而不是在定义const时要设置的值。我该怎么做?
我知道我不能简单地使用set,但是使用const可以更有效地利用资源,并且更加优雅,其他开发人员也更容易理解,我不希望有set,因此他们不会添加它。
如果我有 2 个构造函数重载
calculations(double vector, double angle);
calculations(double horizontalVector, double verticalVector);
Run Code Online (Sandbox Code Playgroud)
我如何确保编译器专门使用我选择的重载之一(因为每个重载在幕后做不同的事情)?
c++ constructor overloading disambiguation ambiguous-grammar
根据我的理解,我知道当一个对象被实例化时,构造函数被调用一次。但我不明白为什么两个构造函数都被调用而只有一个对象被实例化
#include <iostream>
using namespace std;
#define print(me) cout << me << endl;
class A
{
public:
A() { print("default called"); }
A(int x) { print("paramterized called"); }
};
int main()
{
A a;
a = A(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到输出:默认调用参数化调用
这就是我所拥有的:
class Vector3 {
private:
float x;
float y;
float z;
public:
Vector3(float x = 0, float y = 0, float z = 0) {
this->x = x;
this->y = y;
this->z = z;
}
...
};
Run Code Online (Sandbox Code Playgroud)
我觉得this->something = something很重复。我只想用参数构造一次 Vector3 并
然后不再访问这些字段,只需使用方法添加 Vector3。
有什么方法可以简化构造函数而不需要这样做吗this->something = something?或者有什么方法可以“密封”这些字段?
这是C和C++之间边界层上的一行函数.该函数获取了一堆void*
并将它们转换为它们应该存在的类型.发现错误:
MDLPeriph periph_dline = *static_cast<MDLPeriph*>(dline_periph);
Run Code Online (Sandbox Code Playgroud)
确实,periph_dline应该是一个参考.让我感到困惑的是,这段代码在没有警告的情况下编译.此外,gdb在检查此代码时,报告Internal GDB error.和崩溃.
据我所知,上面的代码默认构造了一个MDLPeriph对象.然后使用新对象的复制构造函数从右侧分配值.
但是MDLPeriph没有默认构造函数!这怎么可能?
平台和工具:
Windown 7
yagarto的这个版本使用以下版本:binutils:2.23.1 gcc:4.7.2 newlib:1.20.0 gdb:7.5.1
(2012年12月22日,mifi)openocd o.7.0
constructor ×10
c++ ×7
c# ×1
class ×1
const ×1
constants ×1
inheritance ×1
java ×1
move ×1
object ×1
oop ×1
overloading ×1
parameters ×1
python ×1
simplify ×1