在我的工作场所,通常在声明中指定默认参数.什么是正常的自定义?我应该在方法声明或方法定义中指定默认参数吗?
编辑:有没有办法为引用指定默认参数?
编辑:有人可以提供参考参数的默认参数的示例吗?
希望看到这个的人知道默认参数:
void setCase (string &str, int form = UPPERCASE)
{
for (char &c : str)
c = (form == UPPERCASE ? c & ~0x20 : c | 0x20); //this bit differentiates english uppercase and lowercase letters
}
int main()
{
string s1 = "HeLlO", s2 = s1, s3 = s1;
setCase (s1, UPPERCASE); //now "HELLO"
setCase (s2, LOWERCASE); //now "hello"
setCase (s3); //now "HELLO" due to default argument
}
Run Code Online (Sandbox Code Playgroud)
使用默认参数的一个缺点是您必须在列表末尾启动默认参数.有时,这涉及将参数重新排列为一个看起来很愚蠢的订单.要解决这个问题,必须进行单独的重载.
让我拿一个Window API函数FindWindow,它通过类名,标题或两者找到一个窗口,作为一个例子:
HWND WINAPI FindWindow( //returns handle to …Run Code Online (Sandbox Code Playgroud) 这是我的班级栏:
class Bar:
def __init__(self, start, end, open, volume, high=open, low=open, last=open):
self.start = start
self.end = end
self.open = open
self.high = high
self.low = low
self.last = last
self.volume = int(volume)
def __str__(self):
return self.start.strftime("%m/%d/%Y\t%H:%M:%S") + "\t" + self.end.strftime("%H:%M:%S") + "\t" +str(self.open) + "\t" + str(self.high) + "\t" + str(self.low) + "\t" + str(self.last) + "\t" + str(self.volume)
Run Code Online (Sandbox Code Playgroud)
1)我试图初始化高,低和最后的任何打开.这是正确的方法吗?
2)当我打印(str(bar))我得到有趣的输出,如...
03/13/2012 12:30:00 13:30:00 138.91 <built-in function open> 138.7 <built-in function open> 13177656
假设我有这个功能:
def a(b=[]):
b += [1]
print b
Run Code Online (Sandbox Code Playgroud)
调用它会产生以下结果:
>>> a()
[1]
>>> a()
[1, 1]
>>> a()
[1, 1, 1]
Run Code Online (Sandbox Code Playgroud)
当我改为b += [1]时b = b + [1],函数的行为会改变:
>>> a()
[1]
>>> a()
[1]
>>> a()
[1]
Run Code Online (Sandbox Code Playgroud)
有b = b + [1]什么不同b += [1]?为什么会这样?
以下位代码在GCC 4.5.3中编译,但不在VS 2008和2010中编译.这是由于VS编译器错误还是标准禁止给出默认函数模板参数值?
#include <cstdlib>
struct Bar
{
enum Group{ A , B , C };
};
struct Foo
{
template<typename T>
static void getSome( typename T::Group = T::A );
};
template<typename T>
void Foo::getSome( typename T::Group )
{
};
int main()
{
Foo::getSome<Bar>(); // Does not compile in VS 2008 & 2010 (compiles in gcc 4.5.3)
Foo::getSome<Bar>( Bar::C ); // Compiles in VS 2008 and gcc 4.5.3
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
错误信息
prog.cpp(11) : error C2589: '::' : illegal token …Run Code Online (Sandbox Code Playgroud) 我在班上创建了一个函数.我将所有声明放在头文件中,并将所有定义放在我的.cpp中.
在我的标题中:
class FileReader{
public:
FileReader(const char*); //Constructor
std::string trim(std::string string_to_trim, const char trim_char = '=');
};
Run Code Online (Sandbox Code Playgroud)
在我的.cpp中:
std::string FileReader::trim(std::string string_to_trim, const char trim_char = '='){
std::string _return;
for(unsigned int i = 0;i < string_to_trim.length();i++){
if(string_to_trim[i] == trim_char)
continue;
else
_return += string_to_trim[i];
}
return _return;
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试编译并运行它时,我都会遇到两个错误.
错误:为'std :: string FileReader :: trim(std :: string,char)'[-fpermissive]的参数2给出的默认参数
错误:在'std :: string FileReader :: trim(std :: string,char)'[-fpermissive]中的先前规范之后
我究竟做错了什么?我只是希望我的函数有这个默认参数.
我试图编写一个具有可选参数的C函数,如果该参数未被"使用",则它具有默认值.
int DumpData(int a, int b, int c=0)
{
if(c != 0)
{
//stuff
}
//banana
}
/* Function Call */
DumpData(1, 2);
Run Code Online (Sandbox Code Playgroud)
有什么方法可以解决这个问题吗?
我需要将一个函数(不调用它)传递给另一个函数,但我需要为默认参数指定一个不同的值.
例如:
def func_a(input, default_arg=True):
pass
def func_b(function):
pass
func_b(func_a(default_arg=False))
Run Code Online (Sandbox Code Playgroud)
但是,这会调用 func_a()并将结果传递给func_b().
如何设置default_arg=False而不执行func_a?
在C++中,我们可能会写这样的东西:
#include <cassert.h>
#include <cstdio.h>
#include <cstdarg.h>
void func(..., short end = 0) {
// prevent caller from overriding default value with something other than null
assert(end == 0);
va_list args;
short x;
x = va_arg(args, short);
while (x != 0) {
printf("%d", va_arg(args, short));
}
va_end(list);
return;
}
Run Code Online (Sandbox Code Playgroud)
但是,C不支持默认函数参数.有没有我可以强制func在其参数列表的末尾有一个尾随空字符?有没有办法在没有程序员明确地将终止空值传递给函数的情况下执行此操作?
我们不希望看到如下调用:
int x = 5;
float y = 6.4;
func(x, y, 0);
Run Code Online (Sandbox Code Playgroud)
我们只是想要func(x, y);.
是否可以编写一个可以转换文本的宏
func(x, y);
进入电话:
func(x, y, 0);?
有没有办法在没有宏的情况下做到这一点?
我有一个函数,如果 value_one 大于或小于 value_two,它会根据传递的比较结果打印出来。
template<typename T, typename cmp = less<T> >
void function(T value_one, T value_two, cmp) {
cmp comparator;
if (comparator(value_one, value_two)) {
std::cout << value_one;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这个函数默认使用less函数对象来决定是否打印value_one,但也可以使用more函数对象。
template<typename T>
class more {
public:
bool operator()(const T& value_one, const T& value_two) {
return value_one > value_two;
}
};
template<typename T>
class less{
public:
bool operator()(const T& value_one, const T& value_two) {
return value_one < value_two;
}
};
Run Code Online (Sandbox Code Playgroud)
当我在 main 中调用以下代码时
more<int> a;
function(7,5,a);
Run Code Online (Sandbox Code Playgroud)
7 按预期打印出来,但下一个代码被认为是非法的,VS 告诉我找不到匹配的重载函数。
function(5,7);
Run Code Online (Sandbox Code Playgroud)
我认为 …