关于C++的翻书回顾

来源:互联网 发布:手机网络初始化失败 编辑:程序博客网 时间:2024/06/06 16:43

C++的翻书回顾

自己不知不觉已经学习代码有两年多了,经常借鉴网上各路大神的代码并学习,这次也自己发一下自己最近的关于C++的总结。希望大家多指正。

转载请注明出处:http://blog.csdn.net/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;
}
原创粉丝点击