可能重复:有
什么合理的理由使一元运算符超载?
我刚看了这个问题,我不禁想知道:
为什么有人可能想要重载&
("address-of")运算符?
some_class* operator&() const { return address_of_object; }
有没有合法的用例?
因此,显然C ++ 20正在得到std::to_address
。
从cppreference页面上,它的用例对我来说似乎并不明确。我们已经有了operator&
和std::addressof
,为什么还需要另一个函数来为其参数提供地址?
如果我要在C++中创建一个简单的对象,返回成员的地址与返回指针之间的区别是什么.据我所知,C++没有自动垃圾收集,因此它不会保留引用计数.那么为什么会有人这样做呢:
class CRectangle {
public:
string& getName( );
int& getWidth( );
int& getHeight( );
private:
string name;
int height;
int width;
};
Run Code Online (Sandbox Code Playgroud)
而不是这样:
class CRectangle {
public:
string* getName( );
int* getWidth( );
int* getHeight( );
private:
string name;
int height;
int width;
};
Run Code Online (Sandbox Code Playgroud)
我意识到这些将允许您访问成员数据,但我并不关心这个简单示例中的正确封装.那么差异是什么?加速?可读性?样式?
我试图更好地理解指针和C语言中的引用,我的课程提供了以下程序作为示例.
#include <stdio.h>
void swap(int* a, int* b);
int main(void)
{
int x = 1;
int y = 2;
swap(&x, &y);
printf("x is %i\n", x);
printf("y is %i\n", y);
}
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
Run Code Online (Sandbox Code Playgroud)
我将以下内容混为一谈,看看它是否能帮助我更好地了解正在发生的事情,主要是关于使用&与*(取消引用)的需要.基本上,声明指向int类型(int*a)的指针与使用星号指向"取消引用"(*a =*b)的语法对我来说非常混乱,我希望有人可以启发我.以下是我认为有助于澄清的上述另一个版本,但实际上并非如此:
#include <stdio.h>
void swap(int* a, int* b);
int main(void)
{
int x = 1;
int y = 2;
int *a = &x;
int *b = &y;
swap(a, b);
printf("x is %i\n", …
Run Code Online (Sandbox Code Playgroud) 任何人都可以帮我解决C#中有关VB6中AddressOf运算符的替代解决方案吗?AddressOf返回一个long值.我可以用什么方式获得C#中的输出?
我有一个Objective-C类,它包含一个C风格的结构.我需要调用一个C函数传递一个指向这个对象成员(aka属性)的指针.对于我的生活,我无法弄清楚如何获得这个C结构的地址.使用传统的&
运算符来获取地址,我得到一个LValue编译器错误.
typedef struct _myStruct
{
int aNumber;
}MyStruct, *pMyStruct;
@interface MyClass : NSObject {
MyStruct mystruct;
}
@property (readwrite) MyStruct myStruct;
@end
Run Code Online (Sandbox Code Playgroud)
以下代码导致编译器错误:
MyClass* myClass = [[MyClass alloc] init];
MyStruct* p = &(myClass.myStruct);
Run Code Online (Sandbox Code Playgroud)
如何获取指向对象myStruct
成员的指针myClass
?
我有一些问题要将我的VB6项目转换为VB.NET
我不明白这个"AddressOf"函数应该如何在VB.NET中使用
我的VB6代码:
Declare Function MP4_ClientStart Lib "hikclient.dll" _
(pClientinfo As CLIENT_VIDEOINFO, ByVal abab As Long) As Long
Public Sub ReadDataCallBack(ByVal nPort As Long, pPacketBuffer As Byte, _
ByVal nPacketSize As Long)
If Not bSaved_DVS Then
bSaved_DVS = True
HW_OpenStream hChannelHandle, pPacketBuffer, nPacketSize
End If
HW_InputData hChannelHandle, pPacketBuffer, nPacketSize
End Sub
nn1 = MP4_ClientStart(clientinfo, AddressOf ReadDataCallBack)
Run Code Online (Sandbox Code Playgroud) 对不起,这是C#和VB.Net的混合体
我有一个带有2个代表的C#类:
public delegate string GetSettingDelegate(string key);
public event GetSettingDelegate GetSettingEvent;
public delegate void SetSettingDelegate(string key, string value);
public event SetSettingDelegate SetSettingEvent;
Run Code Online (Sandbox Code Playgroud)
在VB类中,我为事件添加了处理程序:
AddHandler _gisCtrl.SetSettingEvent, AddressOf SetSetting
AddHandler _gisCtrl.GetSettingEvent, AddressOf GetSetting
Run Code Online (Sandbox Code Playgroud)
当我尝试删除处理程序时:
RemoveHandler _gisCtrl.SetSettingEvent, AddressOf SetSetting
RemoveHandler _gisCtrl.GetSettingEvent, AddressOf GetSetting
Run Code Online (Sandbox Code Playgroud)
SetSetting没问题,但GetSetting会发出警告:
AddressOf表达式在此上下文中无效,因为AddressOf的方法参数需要与事件的delagate类型进行轻松的对话.
这是方法
Private Sub SetSetting(ByVal key As String, ByVal value As String)
KernMobileBusinessLayer.[Global].Settings.SetValue(key, value)
End Sub
Private Function GetSetting(ByVal key As String)
Return KernMobileBusinessLayer.[Global].Settings.GetString(key)
End Function
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题以及为什么它首先被抛出?2个委托/事件/方法看起来很相似,我不知道为什么一个是好的,一个人发出警告.
是否可以在内存中为变量分配您想要的地址?
我试图这样做,但我收到错误消息“左值需要作为赋值的左操作数”。
int main() {
int i = 10;
&i = 7200;
printf("i=%d address=%u", i, &i);
}
Run Code Online (Sandbox Code Playgroud)
我的方法有什么问题?在 C 中有什么方法可以将我们想要的地址分配给变量吗?
我是 C 新手,目前正在学习数组。我有这个代码:
#include <stdio.h>
int main()
{
int available[6];
for(int o=1; o<=3; o++){
available[o]=20;
printf("%d\n",&available[o]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪个应该输出(以我的理解):
20
20
20
Run Code Online (Sandbox Code Playgroud)
现在的问题是它输出:
2293300
2293304
2293308
Run Code Online (Sandbox Code Playgroud)
我是否错过了一个关键部分并犯了一些愚蠢的错误?任何帮助将不胜感激。
address-operator ×10
c ×3
c++ ×3
pointers ×3
c# ×2
vb.net ×2
addressof ×1
c++20 ×1
callback ×1
coding-style ×1
delegates ×1
dereference ×1
lvalue ×1
objective-c ×1
overloading ×1
printf ×1
reference ×1
vb6 ×1