C++的翻书回顾
自己不知不觉已经学习代码有两年多了,经常借鉴网上各路大神的代码并学习,这次也自己发一下自己最近的关于C++的总结。希望大家多指正。
转载请注明出处:http://blog.youkuaiyun.com/code_while/article/details/78633004
1.在C++中的判断中,0表示false,非0(不论正负)表示true
2.n>>=1;//n的二进制码右移一位,相当于除以2
3.abs()和fabs()的对比。头文件都是<math.h>。abs()是对整数取绝对值,返回值是整数;fabs()是对浮点数取绝对值,返回值是浮点数。
4.整数int(-2147483648~2147483647)长度不足时,可以用long long int型(9223372036854775807~-9223372036854775808)
5.根据空格拆分,将字符串按空格拆分为int型变量。
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
istringstream istr("123 56.7");
cout<<istr.str()<<endl;
int a;
istr>>a;
cout<<"int a="<<a<<endl;
float b;
istr>>b;
cout<<"float b="<<b<<endl;
return 0;
}
输出结果:
123 56.7
int a=123
float b=56.7
6.关于stringstream类
stringstream更像一个缓存区,可以用来缓存各种类型的一个不用固定大小的容器,可以用来进行各种数据类型转换。
但在多次使用同一个缓冲的时候,要注意释放空间。
stringstream ss;
string str;
int k=99;
ss<<k;
ss>>str;
cout<<str<<endl; //显示99
//str=123;
//ss<<str;
//ss>>k;
//cout<<k<<endl; //不确定显示什么。因为ss缓存区仍被占用,需要先释放缓存区中的内容才可以正确的操作。
//释放ss缓存区中保存的数据
ss.clear(); //
Set error state flags (public member function )
//ss.str(""); //
Get/set content (public member function )
str=123;
ss<<str;
ss>>k;
cout<<k<<endl; //显示123
7.string类型的加法
string a,b;
a=a+b; //此处a+b产生了一个新的string对象e,然后e的值再赋给a,效率低,容易产生错误
a+=b; //此处引用了b对象的值,然后直接和a相加再赋给a
//多个字符串相加时
a=a+b+c+d;//由于每次相加都会产生新的内存,容易出现错误
//用append()追加函数,可以避免上述问题
a.append(b).append(c).append(d);//参数表中的参数为字符串类型(&string)或(*char)
a.append(a,3,7)//取字符串a中位置3为起点,长度为7的字符串
8.其他C++小点
#include<iostream>
#include<cmath>
using namespace std;
//静态生存期的对象的举例
//在命名空间作用域中声明的对象都是具有静态生存期的,如果在函数内部的局部作用域中,则需要加static
int a = 100;//形如,static int a=100;
//内联函数举例
//内联函数定义为一些功能简单、规模小,使用频繁的函数
//与一般函数不同在于不是编译后调用时动态链接,而是在编译时将函数体嵌入调用处
//类中的简单功能的函数,为隐式的声明的内联函数,若加上inline,则为显示的声明为内联函数
inline int getFun()
{
return a;
}
//函数重载举例
//函数名一致,但形参的类型或者数量不一样
int getFun(int b)
{
return a / b;
}
//常引用做形参举例
//常对象必须进行初始化,且不能被更新
//常对象只能调用它的常成员函数,而不能调用他的其他成员函数
//无论是否是通过常对象调用常成员函数,在常成员函数调用期间,目的对象统一被视为常对象
//因此常成员函数不能更新亩的对象的数据成员,也不能针对目的对象调用该类中没有用const修改的成员函数
//常数据成员只能通过构造函数的初始化形参列表来获得初值,其他任何函数不能对该成员赋值
class Point
{
public:
Point(int x = 0, int y = 0) :x(x), y(y){}
//友元函数(类),使得相应的友元函数(类)可以访问类中被保护的数据成员
friend float dist(const Point&p1, const Point&p2);
friend Point operator+(const Point&p1,const Point&p2);
friend ostream&operator<<(ostream&out, const Point&p);
private:
int x, y;
};
float dist(const Point&p1, const Point&p2)
{
double x = p1.x - p2.x;
double y = p1.y - p2.y;
return static_cast<float>(sqrt(x*x + y*y));
}
//重载函数——运算符重载
//其中,类属关系运算符“.”、成员指针运算符“.*”、作用域分辨符“::”、三目运算符“?:”不能被重载
//返回类型 operator 运算符(形参表)
//{
// 函数体;
//}
Point operator+(const Point &p1, const Point &p2)
{
return Point(p1.x + p2.x, p1.y + p2.y);
}
ostream&operator<<(ostream&out, const Point&p)
{
out << "(" << p.x << "," << p.y << ")";
return out;
}
int main()
{
//枚举类型举例
enum weekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun };
//声明类型的别名
typedef int natural, intbl;
cout << "枚举类型的举例:" << endl;
for (natural i = Mon; i <= Sun; i++)
{
cout << i << endl;
}
//异或计算(^)
intbl a = 1, b = 2;
a = a^b;//1和2进行异或计算,即0001异或0010,得到答案为0011,即为3
cout << endl << "异或计算的举例:" << endl << a << endl;
cout << endl << "内联函数的举例:" << endl << getFun() << endl;
cout << endl << "重载函数的举例:" << endl << getFun(b) << endl;
const Point myp1(1, 1), myp2(4, 5);
cout << endl << "友元函数和常对象引用的举例:" << dist(myp1, myp2) << endl;
cout << endl << "运算符重载的举例:" << myp1 + myp2 << endl;
return 0;
}