通常你有一个函数,对于给定的参数,它不能生成有效的结果,或者它不能执行某些任务.除了在C/C++世界中不常用的例外之外,基本上有两个学校报告无效结果.
第一种方法将有效返回与不属于函数的codomain的值(通常为-1)混合并指示错误
int foo(int arg) {
if (everything fine)
return some_value;
return -1; //on failure
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是返回函数状态并将结果传递给引用
bool foo(int arg, int & result) {
if (everything fine) {
result = some_value;
return true;
}
return false; //on failure
}
Run Code Online (Sandbox Code Playgroud)
您更喜欢哪种方式?为什么?第二种方法中的附加参数是否会带来显着的性能开销?
据我所知,对于连接到服务器的每个客户端,PHP都会为它生成一个新线程.但是我想知道它是否真实,如果它是真的,这个线程能活多久?该线程是否正确维护所有静态变量?(像数据库连接)
当这个线程被销毁时,它是否会调用所有析构函数?
有时我需要暴露一些班级成员.例如,在以下示例中class Mechanic可能需要直接访问Engine组件.我已多次读过所有字段都应该由mutator(accessor)方法访问,原因有几个.但是在提供非const引用getter时是否有任何优势:
class Car
{
public:
Engine & engine()
{
return m_engine;
}
//as a consequence you will also need to provide const version
const Engine & engine() const
{
return m_engine;
}
private:
Engine m_engine;
}
Run Code Online (Sandbox Code Playgroud)
简单地将引擎组件公开:
class Car
{
public:
Engine engine;
}
Run Code Online (Sandbox Code Playgroud)
您也可以替换public使用protected,如果你不喜欢这样的例子.在现实生活中,当涉及到System.in或者,你在Java中有类似的东西System.out.看起来,要完全符合某些人的说法,你需要执行类似的调用System.getInstance().getOut().println("hello world").在这种情况下,除了很多官僚代码外,我没有看到任何好处.
假设你有一堂课
class C
{
int * i;
public:
C(int * v):i(v) {};
void method() const; //this method does not change i
void method(); //this method changes i
}
Run Code Online (Sandbox Code Playgroud)
现在您可能想要定义此类的const实例
const int * k = whatever;
const C c1(k); //this will fail
Run Code Online (Sandbox Code Playgroud)
但是这会因为非const int C的构造函数C(int*v)而失败
所以你定义了一个const int构造函数
C(const int * v):i(v) {}; //this will fail also
Run Code Online (Sandbox Code Playgroud)
但是这也会失败,因为C的成员"int*i"是非const的.
在这种情况下该怎么办?使用可变吗?铸件?准备const版本的课程?
编辑:经过与Pavel的讨论(下图),我对此问题进行了一些调查.对我来说,C++的作用并不正确.指针目标应该是严格类型,这意味着您不能执行以下操作:
int i;
const int * ptr;
ptr = & i;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,语言语法将const承诺不改变指针的目标.另外int * const ptr是承诺不改变指针值本身.因此,您有两个可以应用const的地方.那么你可能希望你的类为指针建模(为什么不).在这里,事情正在崩溃.C++语法提供了const方法,它们能够保证不会自己更改字段的值,但是没有语法指出你的方法不会改变你的类指针的目标.
解决方法是定义两个类const_C,C …
例:
class C
{
public:
void operator =(int i) {}
};
class SubC : public C
{
};
Run Code Online (Sandbox Code Playgroud)
以下是编译错误:
SubC subC;
subC = 0;
Run Code Online (Sandbox Code Playgroud)
"'subC = 0'中的'operator ='不匹配"
一些消息来源声明这是因为赋值运算符不是继承的.但是,这不仅仅是因为默认构造的复制分配SubC掩盖了它们吗?
是否有必要在这里使用临时线程安全?
int getVal() {
this->_mutex.lock();
int result = this->_val;
this->_mutex.unlock();
return result;
}
Run Code Online (Sandbox Code Playgroud)
我会给你拆卸简单的RAII测试功能
int test()
{
RAIITest raii; //let's say it's a scoped lock
return 3;
}
{
0x004013ce <_Z4testv>: push %ebp
0x004013cf <_Z4testv+1>: mov %esp,%ebp
0x004013d1 <_Z4testv+3>: sub $0x28,%esp
return 3;
0x004013d4 <_Z4testv+6>: lea -0x18(%ebp),%eax
0x004013d7 <_Z4testv+9>: mov %eax,(%esp)
0x004013da <_Z4testv+12>: call 0x4167a0 <_ZN8RAIITestD1Ev> //here destructor is called
0x004013df <_Z4testv+17>: mov $0x3,%eax //here result is pushed onto the stack
}
0x004013e4 <_Z4testv+22>: leave
0x004013e5 <_Z4testv+23>: ret
Run Code Online (Sandbox Code Playgroud)
编译器是gcc/g ++ …
可以将未初始化的对象传递给父类,如下例所示
class C
{
public:
C(int i):
m_i(i)
{};
int m_i;
}
class T
{
public:
T(C & c):
m_c(c)
{
};
C & m_c;
};
class ST : public T
{
public:
ST():
T(m_ci),
m_ci(999)
{
};
C m_ci;
};
Run Code Online (Sandbox Code Playgroud)
在class T构造函数中,c是对未初始化对象的引用.如果在施工期间class T使用c物体,这可能会导致错误.但由于它不是,这编译并正常工作.我的问题是 - 它是否会制定某种范式或良好的设计指令?如果是这样,有什么选择,因为我发现在子类中分配父对象所需的对象很有用.
在旁注中,我想知道为什么不可能改变初始化顺序,以便在初始化某些成员之后调用基类构造函数.
最近我开始合作c++.我听说exported functions但不确定它意味着什么.
所以我的问题是:
exported function?normal function和exported function?如果是的话,它是什么?dll什么关系?我只是干净地安装了laravel.Elixir没有合并我的脚本.我对发生的事情毫无头绪.我看到脚本任务被触发但在public/js目录中没有输出文件.
这是我的gulpfile.js:
elixir(function (mix) {
mix.sass('style.scss')
.scripts([
'vendor/jquery.js',
'vendor/foundation.min.js',
'script.js'
], 'resources/assets/js', 'public/js/app.min.js')
.scripts([
'vendor/modernizr.js'
], 'resources/assets/js', 'public/js/modernizr.js');
});
Run Code Online (Sandbox Code Playgroud)
它适当地编译sass.
这是目录结构:https://www.uploady.com/#!/ download = 21Y0RI_aYe/V7eKiQHIw2gvyXVD