题记
两分钟能学会C++吗!?
请先阅读下面的文章,再决定你要不要当程序员,或者学习C++!
https://blog.csdn.net/EGEFCXzo3Ha1x4/article/details/80105102
一章
在函数里static一个变量的效果
在一个类的函数中定义一个变量,累加它。
void paddyfield::StaticValueTest()
{
static int i= 0;
i++;
cout << i << endl;
sleep(1);
}
在主函数中,反复调用这个函数,会怎样?
int main()
{
paddyfield pad;
pad = paddyfield();
for (int i = 0; i < 100; i ++) {
pad.StaticValueTest();
}
}
结果:
Finished building target: paddyfield
1
2
3
4
5
6
解释:
局部静态变量:
在局部变量之前加上关键字static,局部变量就成为一个局部静态变量。
内存中的位置:静态存储区
初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变;
参考文档:
https://www.cnblogs.com/jhmu0613/p/7131997.html
二章
关于snprintf这样函数的一些了解
1、这类函数复制的字符个数一般是你输入空间大小-1
vsnprintf(src_char, 1024, format, args);
这时只会复制1023个字符。自动保证以‘\0’
结尾
2、这里的函数机理都会涉及vsnprintf这个函数,其中有牵连到可变参数的传递。
函数应用:
void straddstr(string &src, const char *format, ...)
{
va_list args;
va_start(args, format);
char src_char[1024] = {0};
vsnprintf(src_char, sizeof(src_char), format, args);
src += src_char;
va_end(args);
}
这是一个标准的可变参数的传递与应用。其中关键的是
va_list
va_start
va_end
这类va系列的方式,是最常见的可变参数传递。
::这里值得注意的是这些基本都是宏定义的,你也不能直接对它们进行逐个调用,除非你使用va_arg
这个函数,但是这个函数又要求你向它说明可变参数的类型,所以你想实现类似于snprintf的函数,还是直接调用vsnprintf这样现成的函数比较好。
宏应用:
#define OSYSRT(RET, SIZE, format, ...) do {\
int _O_RET = OSystem(SIZE, format, ##__VA_ARGS__);\
if (_O_RET<0 || _O_RET==127)\
{ return RET;}\
} while(0)
在宏里面的应用可以直接参考上面代码。
参考文档:
https://www.cnblogs.com/yongssu/p/4677556.html
三章
关于std::find函数
在普通的list
容器里面,要查找某个元素,比较麻烦,这是我们用std::find
函数来,就能减低代码量。
#include <algorithm>
list<string>::iterator itd;
itd = std::find(lstr.begin(), lstr.end(),"wen");
if (itd != lstr.end()) {
cout << "yes" << endl;
} else {
cout << "no" << endl;
}