explicit
关键字在C++中意味着什么?
这是我的示例代码:
#include <iostream>
#include <string>
using namespace std;
class MyClass
{
string figName;
public:
MyClass(const string& s)
{
figName = s;
}
const string& getName() const
{
return figName;
}
};
ostream& operator<<(ostream& ausgabe, const MyClass& f)
{
ausgabe << f.getName();
return ausgabe;
}
int main()
{
MyClass f1("Hello");
cout << f1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我注释掉,#include <string>
我没有得到任何编译器错误,我想因为它包含在内#include <iostream>
.如果我在Microsoft VS中"右键单击 - >转到定义",它们都指向xstring
文件中的同一行:
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的程序时,我收到一个异常错误:
OperatorString.exe中的0x77846B6E(ntdll.dll):0xC00000FD:堆栈溢出(参数:0x00000001,0x01202FC4)
知道为什么我在评论时出现运行时错误#include <string> …
当涉及构造函数时,添加关键字会explicit
阻止热情的编译器在不是程序员的第一个意图时创建对象.这种机制是否也适用于铸造操作员?
struct Foo
{
operator std::string() const;
};
Run Code Online (Sandbox Code Playgroud)
例如,在这里,我希望能够投入Foo
到一个std::string
,但我不希望这种投射是隐含的.
是否可以使用C#中的显式类型转换将基类对象分配给派生类引用?
我试过它,它会产生运行时错误.
我是C#的新手并且学习新单词.在编程c#时,我发现很难理解这两个词的含义是什么.我在字典中查找了含义,这是我得到的:
含蓄
"隐含的东西是间接表达的."
"如果一个品质或元素隐含在某个东西中,它就会参与其中或由它展示;"
明确的
"明确表达或展示的东西清楚公开,没有任何隐藏任何东西的企图"
"如果你明确表达某些事情,那么你就会公开而清楚地谈论它."
我想在C#中理解它.
谢谢你的帮助.
干杯
附加信息:
这是我正在阅读的书中的一部分句子,其中有"隐含"这个词
"这意味着里面的区域和占用者
AreaPerPerson( )
隐含地引用在调用的对象中找到的那些变量的副本AreaPerPerson( )
"
我完全不明白这句话试图说什么.
我知道你可以使用C++关键字'explicit'作为类的构造函数来防止类型的自动转换.您是否可以使用相同的命令来阻止类方法的参数转换?
我有两个类成员,一个将bool作为参数,另一个是unsigned int.当我用int调用函数时,编译器将param转换为bool并调用错误的方法.我知道最终我将替换bool,但是现在不想破坏其他例程,因为这个新例程已经开发出来了.
我正在进行一些地理编码工作,我曾经用selenium
屏幕抓取我需要的位置地址的xy坐标,我将xls文件导入到panda数据帧,并希望使用显式循环来更新没有xy坐标的行,如下面:
for index, row in rche_df.iterrows():
if isinstance(row.wgs1984_latitude, float):
row = row.copy()
target = row.address_chi
dict_temp = geocoding(target)
row.wgs1984_latitude = dict_temp['lat']
row.wgs1984_longitude = dict_temp['long']
Run Code Online (Sandbox Code Playgroud)
我已经读过为什么在我对一个pandas DataFrame进行操作后,这个函数"没有"?并且我完全清楚iterrow只给了我们一个视图而不是一个副本进行编辑,但如果我真的要逐行更新值呢?是否lambda
可行?
这是故事.我创建了一个界面IVehicle
.我明确地在我的类中实现了接口Vehicle.cs
.
这是我的界面:
Interface IVehicle
{
int getWheel();
}
Run Code Online (Sandbox Code Playgroud)
这是我的班级:
class Vehicle: IVehicle
{
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(getWheel());
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这getWheel()
是明确实现的.现在,当我尝试在我的Vehicle类中调用该方法时,我收到一个错误,指示getWheel()
当前上下文中不存在该错误.有人能帮助我理解我做错了什么吗?
我最近注意到C++ 0x中的一个类需要一个显式的默认构造函数.但是,我没有想出一个可以隐式调用默认构造函数的场景.这似乎是一个相当无意义的说明者.我想也许它会Class c;
不赞成,Class c = Class();
但似乎并非如此.
来自C++ 0x FCD的一些相关引用,因为我更容易导航[类似文本存在于C++ 03中,如果不在同一个地方]
12.3.1.3 [class.conv.ctor]
默认构造函数可以是显式构造函数; 这样的构造函数将用于执行默认初始化或值初始化(8.5).
它继续提供显式默认构造函数的示例,但它只是模仿我上面提供的示例.
8.5.6 [decl.init]
默认初始化T类型的对象意味着:
- 如果T是一个(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
8.5.7 [decl.init]
对值类型T的对象进行值初始化意味着:
- 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
在这两种情况下,标准都要求调用默认构造函数.但是如果默认构造函数是非显式的,那就会发生这种情况.为了完整起见:
8.5.11 [decl.init]
如果没有为对象指定初始化程序,则默认初始化该对象;
据我所知,这只是从没有数据的转换.这没有意义.我能想到的最好的是以下内容:
void function(Class c);
int main() {
function(); //implicitly convert from no parameter to a single parameter
}
Run Code Online (Sandbox Code Playgroud)
但显然这不是C++处理默认参数的方式.还有什么会使explicit Class();
行为与众不同Class();
?
生成此问题的具体示例是std::function
[20.8.14.2 func.wrap.func].它需要几个转换构造函数,其中没有一个被标记为显式,但默认构造函数是.
阅读以下博客后:
http://xania.org/200711/ambiguous-overloading
我开始问自己"我不应该总是明确地定义我的构造函数吗?"
所以我开始阅读的不仅仅是发现这篇文章:
http://www.sjbrown.co.uk/2004/05/01/always-use-explicit/
这显示了另一个例子,也解释了他背后的想法.但当然这是博客的一个想法.
我很高兴听到你们中的一些人,你对这种态度的看法,你对这个主题的经验是什么,以及对于任何一种方式的一些例子都会很好.
explicit ×10
c++ ×6
c# ×3
casting ×2
constructor ×2
base-class ×1
c++-faq ×1
dictionary ×1
implicit ×1
interface ×1
loops ×1
pandas ×1
python ×1
string ×1