我理解指针与引用的语法和一般语义,但是我应该如何决定何时在API中使用引用或指针?或多或少?
当然,有些情况需要一个或另一个(operator++需要一个引用参数),但总的来说,我发现我更喜欢使用指针(和const指针),因为语法清楚地表明变量是破坏性地传递的.
例如,在以下代码中:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
Run Code Online (Sandbox Code Playgroud)
使用指针,它总是(更加)明显地发生了什么,所以对于API等,清晰度是一个大问题,指针不是比引用更合适?这是否意味着只应在必要时使用引用(例如operator++)?是否有任何性能问题?
编辑(已完成):
除了允许NULL值和处理原始数组之外,似乎选择归结为个人偏好.我已经接受了下面引用Google的C++样式指南的答案,因为它们提出了"引用可能令人困惑,因为它们具有值语法但指针语义"的观点.
由于清理不应该为NULL的指针参数所需的额外工作(例如,add_one(0)将调用指针版本并在运行时中断),从可维护性的角度来看,使用必须存在对象的引用是有意义的,尽管这是一种耻辱失去句法的清晰度.
Javascript是通过引用传递还是通过值传递?以下是Javascript:Good Parts的示例.我my对矩形函数的参数非常困惑.它实际上是undefined在函数内部重新定义的.没有原始参考.如果我从函数参数中删除它,则内部区域功能无法访问它.
是关闭吗?但是没有返回任何函数.
var shape = function (config) {
var that = {};
that.name = config.name || "";
that.area = function () {
return 0;
};
return that;
};
var rectangle = function (config, my) {
my = my || {};
my.l = config.length || 1;
my.w = config.width || 1;
var that = shape(config);
that.area = function () {
return my.l * my.w;
};
return that;
};
myShape = shape({
name: "Unhnown"
}); …Run Code Online (Sandbox Code Playgroud) 当我这样做:
std::vector<int> hello;
Run Code Online (Sandbox Code Playgroud)
一切都很好.但是,当我把它作为引用的向量时:
std::vector<int &> hello;
Run Code Online (Sandbox Code Playgroud)
我得到了可怕的错误
错误C2528:'指针':指向引用的指针是非法的
我想把一堆结构的引用放到一个向量中,这样我就不必插入指针了.为什么矢量会对此发脾气?我唯一的选择是使用指针向量吗?
我觉得这有点主观; 我不确定这个意见是否会一致(我已经看过很多代码片段,其中返回了引用).
根据对这个问题的评论我刚刚问过,关于初始化引用,返回引用可能是邪恶的,因为,[据我所知]它更容易错过删除它,这可能导致内存泄漏.
这让我很担心,因为我跟随了一些例子(除非我想象的事情)并且在相当多的地方做到了这一点......我误解了吗?这是邪恶的吗?如果是这样,那有多邪恶?
我觉得因为我的指针和引用混合在一起,再加上我是C++的新手,以及对什么时候使用的完全混淆,我的应用程序必须是内存泄漏地狱......
另外,我知道使用智能/共享指针通常被认为是避免内存泄漏的最佳方法.
我的Visual Studio解决方案中有四个项目(每个人都针对.NET 3.5) - 对于我的问题,这两个项目很重要:
我加入了elmah.dll参考MyBaseProject通过点击在Visual Studio 2008中的"添加引用..."→"浏览"选项卡→选择"elmah.dll".
Elmah Reference的属性如下:
在MyWebProject1中,我通过以下方式添加了对Project MyBaseProject的引用:"Add reference ..."→"Projects"选项卡→选择"MyBaseProject".除以下成员外,此引用的属性相同:
如果我在Visual Studio中运行构建,则elmah.dll文件将与MyBaseProject.dll一起复制到MyWebProject1的bin目录中!
但是,如果我清理并运行MSBuild解决方案(通过D:\ webs\CMS> C:\ …
我一直在使用C++,我一直在想新的关键字.简单地说,我应该使用它吗?
1)使用新关键字...
MyClass* myClass = new MyClass();
myClass->MyField = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
2)没有新的关键字......
MyClass myClass;
myClass.MyField = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
从实现的角度来看,它们看起来并没有什么不同(但我确定它们是......)但是,我的主要语言是C#,当然第一种方法就是我习惯的方法.
困难似乎是方法1更难用于std C++类.
我应该使用哪种方法?
我最近使用new关键字作为堆内存(或免费存储)用于超出范围的大型数组(即从函数返回).在我使用堆栈之前,导致一半的元素在范围之外被破坏,切换到堆使用确保元素是完整的.好极了!
我的一位朋友最近告诉我,使用new关键字有一个简单的规则; 每次打字new,输入delete.
Foobar *foobar = new Foobar();
delete foobar; // TODO: Move this to the right place.
Run Code Online (Sandbox Code Playgroud)
这有助于防止内存泄漏,因为您总是必须将删除放在某处(即,当您将其剪切并粘贴到析构函数或其他方式时).
我得到了:
找不到类型或命名空间名称
VS2010中的C#WPF应用程序出错.这段代码编译得很好,但突然间我收到了这个错误.我已经尝试删除项目参考和using声明,关闭VS2010并重新启动,但我仍然有这个问题.
任何想法为什么会发生这种情况,看起来我正在做正确的事情参考和using陈述?
我还在VS2010中注意到该命名空间的intellisense工作正常,所以看起来VS2010有项目引用并且一方面看到命名空间,但是在编译期间看不到它?
在给函数提供原始变量时,最好的做法是:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
Run Code Online (Sandbox Code Playgroud)
要么:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
Run Code Online (Sandbox Code Playgroud)
IOW:有没有理由选择一个而不是另一个?
我有一些首选项,您可以启用/禁用菜单上显示的项目.共有17项.我在values/arrays.xml中创建了一个字符串数组,其中包含17个项目中的每个项目的标题.
我有preferences.xml,它有我的首选项文件的布局,我想引用字符串数组中的单个项目作为标题.
我怎样才能做到这一点?
在Android开发人员参考中,我看到我如何使用XML引用单个字符串,但不知道如何使用XML引用数组资源中的字符串.
当一个数组作为参数传递给方法或函数时,它是通过引用传递的吗?
这样做怎么样:
$a = array(1,2,3);
$b = $a;
Run Code Online (Sandbox Code Playgroud)
是$b参考$a?
reference ×10
c++ ×5
pointers ×3
arrays ×2
android ×1
c# ×1
c++-faq ×1
dependencies ×1
directive ×1
javascript ×1
keyword ×1
msbuild ×1
namespaces ×1
new-operator ×1
php ×1
preferences ×1
project ×1
stl ×1
variables ×1
vector ×1
xml ×1