之前学习过一个多月的C++,觉得知识过于零碎,也没有完整的复习一遍,很多知识一知半解的。所以打算重读C++ Primer5th (之前读的是4th
),第5th 加入了C++ 11的许多特性,很值得再次学习一遍。潘爱民(译者)说过,第五版适合多读几遍,每一遍都会有不同的理解,自己要养成这种习惯,慢慢读,课后习题也要认真去做。
看到前言有介绍了几本书,记录下来 —《C++ Concurrency in Action》学习C++并发最佳选择;
—《Linux多线程服务端编程》陈硕
疑问:
1,函数类型用int 与void 返回0与没有返回值 有什么区别?
前面加有void 的函数,不能返回任何数据,return语句不能使用,这类函数应该将所有应该实现的功能在本函数内全部实现。但是并不是不能与外部交换数据,仍然可以通过引用型参数传递数据,只是调用时不能直接接受返回值,因为就没有返回值。
前面有int的函数,返回值是整型数,可能是结果是整数的数,也可能是运行状态,成功或失败的标识,函数调用时可以直接利用返回信息,实现一些功能。
总结:int可以用return返回数据 把数据传输到主函数中 可以用于计算,而void是没有返回数据的 只能用于 比较大小之类的功能。
收获:
1.当无符号数与有符号数相加减时,编译器会将有符号数自动转换为无符号数,同时这两个相加的结果是等于无符号数的摸+有符号数的最终结果。
2.函数体外的变量 未初始化时,默认为0,函数体内的变量不会默认初始化,显示未定义的,(即该变量会显示一个不确定的值,这事非常危险的!)
3.不能把临时对象作为实参传给非const引用。如下:
int i = 42;
const int &r = i; //ok
int r2 = i*2;//error r2是一个非常量引用,i*2会产生临时对象,C++将这种语法视为非法
在函数传参时,也会遇到这种情况如下:
void
conv(
string
&
str) { }
int
main() {
conv(
"
dasd
"
);
//
这里错了,编译器自动生成一个string(“dasd”)临时对象,不能将该临时对象传给非const引用
}
因此,需要将其改为:
void
conv(
string
str) { }
//
值传递
或者
void
conv(
const
string
&str) { }
/
/ const引用,因为标准规定临时对象是不能更改的,所以要加上const修饰。
程序题:
#include <iostream>
using namespace std;
int fun1_9()
{
int sum = 0;
int i = 50;
while(i<100)
{
sum += i;
i++;
}
cout<<"50加到100的结果是:"<<sum;
return 0;
}
int fun1_10()
{
int i = 10;
while(i>0)
{
cout<<i<<endl;
--i;
}
return 0;
}
void fun1_11()
{
cout<<"请输入两个数:";
int v1,v2;
cin>>v1>>v2;
while(v1<v2)
{
cout<<v1;
v1++;
}
}
void fun1_12()
{
int temp,sum = 0;
while(cin>>temp)
{
sum += temp;
}
cout<<sum;
}
void fun1_13()
//统计在输入值数字中,重复数字的个数
{
int cur;
int next;
if(cin>>cur)
{
int count = 1;
while(cin>>next)
{
if(cur == next)
{
++count;
}
else
{
cout<<cur<<"出现了"<<count<<"次";
cur = next;
count = 1;
}
}
cout<<cur<<"出现了"<<count<<"次";
}
}
int main()
{
fun1_13();
//fun1_12();
//fun1_11();
//fun1_10();
// fun1_9();
return 0;
}