小编Mot*_*tti的帖子

C++函数中静态变量的生命周期是多少?

如果变量声明为static在函数的作用域中,则仅初始化一次并在函数调用之间保留其值.它的生命到底是什么?它的构造函数和析构函数何时被调用?

void foo() 
{ 
    static string plonk = "When will I die?";
}
Run Code Online (Sandbox Code Playgroud)

c++ static lifetime

359
推荐指数
4
解决办法
17万
查看次数

260
推荐指数
10
解决办法
20万
查看次数

为什么我不能在.NET中为结构定义默认构造函数?

在.NET中,值类型(C#struct)不能包含没有参数的构造函数.根据这篇文章,这是CLI规范要求的.会发生什么,对于每个值类型,都会创建一个默认构造函数(由编译器?),它将所有成员初始化为零(或null).

为什么不允许定义这样的默认构造函数?

一个微不足道的用途是有理数:

public struct Rational {
    private long numerator;
    private long denominator;

    public Rational(long num, long denom)
    { /* Todo: Find GCD etc. */ }

    public Rational(long num)
    {
        numerator = num;
        denominator = 1;
    }

    public Rational() // This is not allowed
    {
        numerator = 0;
        denominator = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用当前版本的C#,默认的Rational 0/0并不是那么酷.

PS:默认参数是否有助于解决C#4.0或者是否会调用CLR定义的默认构造函数?


Jon Skeet回答道:

要使用您的示例,当有人执行时您希望发生什么:

 Rational[] fractions = new Rational[1000];
Run Code Online (Sandbox Code Playgroud)

它应该通过你的构造函数1000次?

当然应该,这就是我首先编写默认构造函数的原因.当没有定义显式默认构造函数时,CLR应该使用默认的归零构造函数; 这样你只需支付你使用的费用.然后,如果我想要一个1000个非默认Rational的容器(并希望优化1000个结构),我将使用一个 …

.net c# struct

242
推荐指数
6
解决办法
10万
查看次数

C++宏什么时候有用?

ç预处理器有理由担心和C++社区避之唯恐不及.内联功能,功能和模板通常是更安全和更好的替代品#define.

以下宏:

#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)  
Run Code Online (Sandbox Code Playgroud)

绝不是优于安全类型:

inline bool succeeded(int hr) { return hr >= 0; }
Run Code Online (Sandbox Code Playgroud)

但宏确实有它们的位置,请列出您为宏找到的用途,如果没有预处理器,您就无法做到.

请将每个用例放在一个单独的答案中,以便可以进行投票,如果您知道如何在没有预备教授的情况下实现其中一个答案,请指出该答案的评论.

c++ c-preprocessor

171
推荐指数
19
解决办法
9万
查看次数

为什么我们需要在C++中使用纯虚拟析构函数?

我理解虚拟析构函数的必要性.但为什么我们需要纯虚拟析构函数?在其中一篇C++文章中,作者提到我们在创建类抽象时使用纯虚析构函数.

但是我们可以通过将任何成员函数设置为纯虚拟来使类抽象化.

所以我的问题是

  1. 我们什么时候才能真正使析构函数变为虚拟?任何人都能给出一个很好的实时例子吗?

  2. 当我们创建抽象类时,将析构函数设置为纯虚拟是一种很好的做法吗?如果是..那为什么?

c++ destructor pure-virtual

151
推荐指数
6
解决办法
8万
查看次数

用户定义的文字为C++添加了哪些新功能?

C++ 11引入了用户定义的文字,这将允许基于现有文本(采用新的文本语法的int,hex,string,float),使得任何类型的将能够具有字介绍.

例子:

// imaginary numbers
std::complex<long double> operator "" _i(long double d) // cooked form
{ 
    return std::complex<long double>(0, d); 
}
auto val = 3.14_i; // val = complex<long double>(0, 3.14)

// binary values
int operator "" _B(const char*); // raw form
int answer = 101010_B; // answer = 42

// std::string
std::string operator "" _s(const char* str, size_t /*length*/) 
{ 
    return std::string(str); 
}

auto hi = "hello"_s …
Run Code Online (Sandbox Code Playgroud)

c++ user-defined-literals c++11

138
推荐指数
8
解决办法
3万
查看次数

如何在Javascript中执行shell命令

我想编写一个JavaScript函数,它将执行系统shell命令(ls例如)并返回值.

我该如何实现这一目标?

javascript

108
推荐指数
9
解决办法
36万
查看次数

wtf是WTF?(在WebKit代码库中)

我下载了Chromium的代码库并运行了WTF命名空间.

namespace WTF {
    /*
     * C++'s idea of a reinterpret_cast lacks sufficient cojones.
     */
    template<typename TO, typename FROM>
    TO bitwise_cast(FROM in)
    {
        COMPILE_ASSERT(sizeof(TO) == sizeof(FROM), WTF_wtf_reinterpret_cast_sizeof_types_is_equal);
        union {
            FROM from;
            TO to;
        } u;
        u.from = in;
        return u.to;
    }
} // namespace WTF
Run Code Online (Sandbox Code Playgroud)

这是否意味着我的意思?可能是这样,bitwise_cast如果POD中的任何一个TOFROM不是POD并且不是(AFAIK)比内置的C++更强大,那么这里指定的实现将不会编译reinterpret_cast.

我在这里看到的唯一亮点就是没有人似乎bitwise_cast在Chromium项目中使用.

c++ webkit chromium

89
推荐指数
2
解决办法
2万
查看次数

MSIL和Java字节码之间的区别?

我是.Net的新手,我想先了解基础知识.MSIL和Java字节码有什么区别?

.net java cil bytecode

78
推荐指数
4
解决办法
2万
查看次数

为什么.NET中没有RAII?

作为一名C++开发人员,Java和.NET中缺少RAII(资源获取是初始化)一直困扰着我.清理的责任从班级作者转移到其消费者(通过try finally.NET的using构造)这一事实似乎显然是劣等的.

我明白为什么在Java中不支持RAII,因为所有对象都位于堆上,而垃圾收集器本身并不支持确定性破坏,但在.NET中引入了values-types(struct)我们有(看似) RAII的完美候选人.在堆栈上创建的值类型具有明确定义的范围,并且可以使用C++析构函数语义.但是,CLR不允许值类型具有析构函数.

我的随机搜索发现了一个论点,如果一个值类型被装箱,它就属于垃圾收集器的管辖范围,因此它的破坏变得不确定.我觉得这个论点不够强大,RAII的好处足以说明带有析构函数的值类型不能被装箱(或用作类成员).

简而言之,我的问题是:为了将RAII引入.NET,是否有任何其他原因无法使用值类型?(或者您认为我关于RAII明显优势的论点有缺陷吗?)

编辑:我必须没有明确表达这个问题,因为前四个答案已经错过了重点.我知道关于Finalize其不确定性的特点,我知道的using结构,我觉得这两个选项都逊色于RAII.using是一个阶级的消费者必须记住的另一件事(有多少人忘了把它StreamReader放在一个using街区?).我的问题是关于语言设计的哲学问题,为什么它是这样的,它可以改进吗?

例如,对于通用的确定性可破坏的值类型,我可以使usinglock关键字冗余(可以通过库类实现):

    public struct Disposer<T> where T : IDisposable
    {
        T val;
        public Disposer(T t) { val = t; }
        public T Value { get { return val; } }
        ~Disposer()  // Currently illegal 
        {
            if (val != default(T))
                val.Dispose();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我忍不住以我曾经看过的apropos报价结束,但目前无法找到它的起源.

当我的冷死手超出范围时,你可以采取我的确定性破坏.- 匿名

.net struct destructor raii value-type

64
推荐指数
3
解决办法
7974
查看次数