在Java中,我们看到许多final
可以使用关键字的地方,但它的使用并不常见.
例如:
String str = "abc";
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)
在上述情况下,str
可以final
但通常不会这样做.
当一个方法永远不会被覆盖时,我们可以使用final关键字.类似地,如果一个类不会被继承.
在任何或所有这些案例中使用final关键字是否真的能提高性能?如果是这样,那怎么样?请解释.如果正确使用final
真正重要的性能,应在Java程序员开发什么习惯,使关键字的最好用?
我一直认为,对于任何空std::vector
V,V.begin() == V.end()
.然而,我在C++规范中没有看到任何说明这一点始终是真的.它是否一定是真的,或者在大多数实现中是否恰好是真的?
在C++ 11中,您可以使用a shared_ptr<>
与对象或变量建立所有权关系,并weak_ptr<>
以非拥有方式安全地引用该对象.
您还可以使用unique_ptr<>
与对象或变量建立所有权关系.但是,如果其他非拥有对象想要引用该对象呢?weak_ptr<>
在这种情况下没有帮助.原始指针很有用,但会带来各种缺点(例如,它们可以自动初始化为nullptr,但这是通过与std::*_ptr<>
类型不一致的技术实现的).
什么是对weak_ptr<>
拥有的对象的非拥有引用的等价物unique_ptr<>
?
这是一个澄清的例子,类似于我正在研究的游戏中的某些东西.
class World
{
public:
Trebuchet* trebuchet() const { return m_trebuchet.get(); }
private:
std::unique_ptr< Trebuchet > m_trebuchet;
};
class Victim
{
public:
Victim( Trebuchet* theTrebuchet ) : m_trebuchet( theTrebuchet ) {}
~Victim()
{
delete m_trebuchet; // Duh. Oops. Dumb error. Nice if the compiler helped prevent this.
}
private:
Trebuchet* m_trebuchet; // Non-owning.
};
shared_ptr< Victim > createVictim( World& world …
Run Code Online (Sandbox Code Playgroud) 有没有办法在Markdown文档中指明文档标题?
我来使用Markdown和Sublime Text来准备我的许多个人和商业文档.例如,我经常希望有一种类似于Word中的标题样式的"顶级"标题.所以,例如:
### Things to Do ###
At Home
=======
* Mow the cat
* Feed the lawn
At the Office
=============
* Learn Markdown
* Use Big-O notation in a clever way
Run Code Online (Sandbox Code Playgroud)
但### Things to Do ###
Markdown没有尊重这条线,我不知道另一种选择.有吗?
我可以使用Heading 1样式作为标题,然后使用Heading 2作为其余部分,但如果我需要更深入的标题嵌套,我很快就会用完.而且,毕竟,标题本身并不是一个标题.例如,如果Markdown-to-HTML解析器使用标题作为页面<title>
以及页面顶部标题和单词标题,那将是很好的.
我正在编写一个iOS应用程序,其中包括一个telnet服务器.当然,它一开始就会开始监听连接.
当我在模拟器中运行应用程序时,Mac OS X(我碰巧在10.7.3上)提示我允许或拒绝我的应用程序接受传入的网络连接.这是Mac OS X用于所有未签名的联网应用程序的标准防火墙消息.
我厌倦了每天点击"允许"五十次或更多次,所以我寻求一种将我的应用程序永久添加到防火墙允许的应用程序列表的方法.
我尝试了以下内容.
在最后一步中,有一个重要的决定.您可以在该包上添加.app应用程序包或Show Contents,并在其中添加"Unix可执行文件".我尝试了两种方法.
有趣的是,防火墙实际上会暂时停止向您发出关于应用程序的警告.几运行后,但是,目前尚不清楚对我有什么事件实际上导致这种变化,但半小时左右的时间内发生的对我来说,一般来说,防火墙开始再次警告有关的应用程序.
如何将防火墙设置为永久允许我的iOS应用程序?
当然,我可以通过禁用Mac OS X防火墙来绕过这整个问题.我也可以通过砍掉它来避免再次在我的脚下划伤.这些行动方案都没有向我推荐.
你会建议什么?
在Visual Studio中 - 我的主要挤压多年 - 我可以按Ctrl + F立即搜索我的文本插入符号正在触摸的标识符或字符串,或者如果我有选择则搜索当前选择的文本.我可以按Ctrl + Shift + F搜索整个项目,解决方案或其他文件集.我喜欢这个.
在Xcode 3.* - 近年来我的主要压力 - 我可以按Cmd + Opt + F立即搜索当前选择的文本和Cmd + Opt + Shift + F(有点少但可行),以便搜索整个项目.我喜欢这个比VS方法少一点,因为我首先必须选择一些文本,然后搜索它,而不是如果我没有选择任何东西,IDE会自动为我提取当前标识符.但它很好.
现在在Xcode 4中,我注意到有一个Cmd + E快捷方式使Xcode"使用选择进行查找".但它......糟透了.它显然只是复制当前选择并将其粘贴到查找框中.它不显示查找框,因此如果当前未显示查找框,则Cmd + E没有可见效果.Cmd-E实际上不会调用搜索 - 它只复制文本.因此,现在搜索标识符变为三步过程:选择标识符,按Cmd + E,按Cmd + F(或Cmd + Shift + F进行项目范围搜索).
IMO,Xcode 4的三步过程比Xcode 3的两步过程更糟糕,这比Visual Studio的一步过程更糟糕.
我的问题:鉴于随着近期国际事件的UI效率下降,世界正在走下坡路,很快一切都将以一场火热的灾难结束,其中少数剩余的人类将被迫每次他们想要重新输入战争与和平搜索标识符?
C++ 11的std :: shared_ptr <>提供了一种bool运算符.
operator unspecified-bool-type() const;
Run Code Online (Sandbox Code Playgroud)
(operator bool() const
由于类型的隐式转换带来的危险,这不是直接的bool
.)
为什么std :: weak_ptr <>没有类似的运算符?我发现自己经常打字
if( !wp.expired() )
Run Code Online (Sandbox Code Playgroud)
当我想打字的时候
if( wp )
Run Code Online (Sandbox Code Playgroud)
为什么没有针对weak_ptr的bool转换?
可能重复:
类实例上的C++静态成员方法调用
今天我发现我长期以来的事情(我的意思是长期的,二十年),在C++中被认为是非法的,实际上是合法的.即,调用静态成员函数,就好像它属于单个对象一样.例如:
struct Foo
{
static void bar() { cout << "Whatever."; }
};
void caller()
{
Foo foo;
foo.bar(); // Legal -- what?
}
Run Code Online (Sandbox Code Playgroud)
我通常会看到静态成员函数严格使用"作用域解析语法"调用,因此:
Foo::bar();
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为静态成员函数不与类的任何特定实例相关联,因此,我们不希望一个特定的实例进行语法"连接到"函数调用.
然而我今天发现GCC 4.2,GCC 4.7.1和Clang 3.1(作为编译器的随机抽样)接受前一种语法,以及:
Foo* foo = new Foo;
foo->bar();
Run Code Online (Sandbox Code Playgroud)
在我的具体情况,该表达式的合法性导致运行时错误,印证了这种语法的特点是比学术更感兴趣,它有着实际的后果.
为什么C++允许调用静态成员函数,就像它们是单个对象的直接成员一样 - 也就是说,通过使用.或 - >语法附加到对象实例?
std::equal()
是不安全的,因为该函数无法知道它是否会超出要比较的第二个容器的长度.那是:
std::vector< int > v( 100 );
std::vector< int > w( 10 );
bool same = std::equal( v.begin(), v.end(), w.begin() );
Run Code Online (Sandbox Code Playgroud)
...将导致缓冲区溢出w
.
当然,我们可以测试这些东西(v.size() == w.size()
),但像Visual Studio 2010这样的编译器仍然将函数本身报告为不安全.事实上,它在某种基本意义上是不安全的:具有不同经验水平的程序员团队最终会忘记比较大小.
安全的替代方案易于实施.
template< typename Iter1, typename Iter2 >
bool equal_safe( Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2 )
{
while( begin1 != end1 && begin2 != end2 )
{
if( *begin1 != *begin2 )
{
return false;
}
++begin1;
++begin2;
}
return begin1 == end1 && …
Run Code Online (Sandbox Code Playgroud) 说我有一个数组AnyObject
.
let grabBag: [AnyObject] = [ "Tom", 4, "Dick", NSObject(), "Harry" ]
Run Code Online (Sandbox Code Playgroud)
我想将它转换为一个数组Strings
,只提取那些实际上的元素Strings
.我希望这可行:
let strings = grabBag.filter{ $0 is String } as! [String] // 1
Run Code Online (Sandbox Code Playgroud)
但它给出了错误'Bool' is not convertible to 'String'
.但这有效:
let definitelyStrings = grabBag.filter{ $0 is String } // 2
let strings = definitelyStrings as! [String] //
Run Code Online (Sandbox Code Playgroud)
为什么不2
工作1
?而且是有一个更简单的(除2
提取和铸造的元素)的方式[AnyObject]
,以什么[T]
?