我现在正在我的大学学习C ++和OOP的基础知识。我不确定100%分配函数给函数指针时如何工作。我遇到了以下代码:
void mystery7(int a, const double b) { cout << "mystery7" << endl; }
const int mystery8(int a, double b) { cout << "mystery8" << endl; }
int main() {
void(*p1)(int, double) = mystery7; /* No error! */
void(*p2)(int, const double) = mystery7;
const int(*p3)(int, double) = mystery8;
const int(*p4)(const int, double) = mystery8; /* No error! */
}
Run Code Online (Sandbox Code Playgroud)
从我的理解来看,p2和p3分配很好,因为函数参数类型匹配并且const-ness是正确的。但是,为什么p1和p4分配失败?将const double / int与非const double / int匹配是否不合法?
在C++中声明枚举的标准方法似乎是:
enum <identifier> { <list_of_elements> };
Run Code Online (Sandbox Code Playgroud)
但是,我已经看到了一些声明,例如:
typedef enum { <list_of_elements> } <identifier>;
Run Code Online (Sandbox Code Playgroud)
如果存在,它们之间有什么区别?哪一个是正确的?
在实现接口时,似乎教程和文献中的常用方法是声明一个ivar,然后设置@propertythen @synthesize.
@interface MyClass : NSObject {
NSString *myString;
}
@property (nonatomic, retain) NSString *myString;
@end
Run Code Online (Sandbox Code Playgroud)
但是,省略显式声明并仅放置@property具有相同的效果.
@interface MyClass: NSObject {
}
@property (nonatomic, retain) NSString *myString;
@end
Run Code Online (Sandbox Code Playgroud)
那么大多数人如何使用@property和明确宣言?不好的形式不是吗?
C++中允许使用以下代码:
int a = a;
Run Code Online (Sandbox Code Playgroud)
要么
Type name = name;
Run Code Online (Sandbox Code Playgroud)
两者都会导致未初始化的对象被自身初始化,这通常会导致未定义的行为.
这样的代码是否需要或合理?是否存在此类代码有用的情况?
你用吗
require "name"
Run Code Online (Sandbox Code Playgroud)
要么
local name = require "name"
Run Code Online (Sandbox Code Playgroud)
另外,您是否明确将系统模块声明为局部变量?例如
local io = require "io"
Run Code Online (Sandbox Code Playgroud)
请解释你的选择.
Lua 2ed中的编程说"如果她更喜欢使用较短的名称来代替模块,她可以为它设置一个本地名称",而不是local m = require "mod"更快require "mod".如果没有区别,我宁愿使用清洁require "mod"声明,也不会为预加载的系统模块编写声明.
我头上有很多问号.我没有得到的是在xcode 4.3之前我需要在我的实现文件中声明前向声明(对于私有方法).
就像我的.m文件一样:
// deleting this with xcode 4.3 the below code still does work
// in previous versions i had to put this because otherwise the compiler can't find methodFirst
@interface DetailViewController ()
- (void)methodFirst;
- (void)methodSecond;
@end
@implementation DetailViewController
- (void) methodSecond
{
// if i delete the forward declaration now adays i dont get a compiler error that he cant find method first
[self methodFirst];
}
- (void) methodFirst
{
}
@end
Run Code Online (Sandbox Code Playgroud)
现在看来我不再需要那样做了?Apple是否更新了编译器以便不再需要提交声明?
我找不到任何有关此更改的Apple官方消息来源的参考.我想知道其他人在新环境中遇到了什么.
当尝试为多个平台编译以下(简化)代码时,我发现它在某些方面失败了,即IBM的xlC_r.进一步的调查发现,它也没有在考虑和铿锵声.它使用g ++和Solaris的CC成功编译.
这是代码:
int main()
{
int a1[1];
bool a2[1];
for (int *it = a1, *end = a1+1; it != end; ++it) {
//...
bool *jt = a2, *end = a2+1;
//...
}
}
Run Code Online (Sandbox Code Playgroud)
xlC_r错误:
"main.cpp", line 8.25: 1540-0400 (S) "end" has a conflicting declaration.
"main.cpp", line 6.25: 1540-0425 (I) "end" is defined on line 6 of "main.cpp".
Run Code Online (Sandbox Code Playgroud)
铿锵声:
main.cpp:8:25: error: redefinition of 'end' with a different type
bool *jt = a2, *end = a2+1;
^
main.cpp:6:25: note: previous definition …Run Code Online (Sandbox Code Playgroud) 通常,Java可以被视为类型安全的语言.我知道泛型有一些缺陷,但我最近遇到了一个前所未有的问题.要打破它:
Object[] objects = new Integer[10];
objects[0] = "Hello World";
Run Code Online (Sandbox Code Playgroud)
不会导致预期的编译时错误.我会假设一个数组的声明Object将不允许指向一个其他的数组.在泛型中,我不允许做出如下奇怪的事情:
ArrayList<Object> objs = new ArrayList<Integer>
Run Code Online (Sandbox Code Playgroud)
如果我试图欺骗Java做一些事情
ArrayList<? extends Object> objects = new ArrayList<Integer>
Run Code Online (Sandbox Code Playgroud)
我被允许声明它,但我只能添加类型的对象null.
为什么Java不会阻止声明这样的weired数组呢?
所以这是一个奇怪的,我知道代码本身是相当无用的,但我想知道为什么我得到错误:
我写了一些代码,我写了这个:
if(scan.hasNextInt())
int row = scan.nextInt();
Run Code Online (Sandbox Code Playgroud)
当时没有考虑变量范围,显然这是无用的,因为无论如何我都不能使用row过去if.我没有得到的是我收到错误的原因:
> javac hw.java
hw.java:25: '.class' expected
int row = scan.nextInt();
^
hw.java:25: not a statement
int row = scan.nextInt();
^
hw.java:25: illegal start of expression
int row = scan.nextInt();
^
hw.java:25: ';' expected
int row = scan.nextInt();
^
Run Code Online (Sandbox Code Playgroud)
现在,如果我只是修改它,如果检查:
if(scan.hasNextInt()) {
int row = scan.nextInt();
}
Run Code Online (Sandbox Code Playgroud)
它会编译好.我的印象是,如果if大括号下面有1行是可选的......显然还有其他考虑,或者两者都要编译或失败.
有人可以向我解释,或者指向一个文档,解释为什么我不能在if没有大括号的条件下声明局部变量?
编辑:这是完整的功能:
public static char getinput() {
System.out.println("Where do you want to go? (row column)");
Scanner …Run Code Online (Sandbox Code Playgroud) 好的,我知道这看起来像是复制了为什么在使用之前需要声明函数?但似乎现有答案并未完全解决所有细节问题.
我知道C++最初是在80年代设计的,所以它可以在一次通过中翻译,因为计算机很慢.好.但是最新的标准是在2011年发布的,所以我不明白为什么C++编译器现在不能做需要多次传递的事情.它仍然会伤害性能,是的,但只有在它真的变得必要的时候.所以以下内容仍然只需要一次传递:
void foo();
int main() { foo(); }
void foo() {}
Run Code Online (Sandbox Code Playgroud)
而对于以下情况,编译器可以使两个(并且更慢),因为它不知道foo是函数还是类型,直到它看到下面的声明:
int main() { foo(); }
void foo() {}
Run Code Online (Sandbox Code Playgroud)
如果你试图使用一个函数而不首先声明它,并且声明根本不在当前的翻译单元中,那么这将是一个错误.但是如果它在同一个翻译单元中,那么编译器可以只进行额外的传递.
我的同事辩称,这样的功能可以节省大量的开发人员时间,并且可以避免声明和定义不匹配的问题.而且我确信这已被多次提出并且每次都被拒绝.拒绝它的实际原因是什么,即委员会的理由?
declaration ×10
c++ ×5
java ×2
objective-c ×2
arrays ×1
c++11 ×1
const ×1
dynamic ×1
enums ×1
for-loop ×1
forward ×1
if-statement ×1
import ×1
ivar ×1
lua ×1
module ×1
parameters ×1
properties ×1
require ×1
scope ×1
type-safety ×1
typedef ×1
variables ×1
xcode ×1