C++学习笔记1

Posted 做个优雅的衣冠禽兽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++学习笔记1相关的知识,希望对你有一定的参考价值。

本人是是大一学的C,现在大二新开了C++。于是便开始入手C++。所以一开始就没有无所谓的基本的总结。直接是从C过渡到C++。

 

一、对C++的初步认识

 

1. 在C中不支持表达式做左值, 即在C中a=b=100可以,但(c=d)=200不可以,因为(c=d)为表达式。在C++中表达式可以被赋值。

a=b=100;//运算过程:先将100赋给b,然后再将b赋给a,此代码在C中也可以。

(c=d)=200;//运算过程:先将d赋给d,再将200赋给c。等价于c=d;c=200,此代码只能在C++中通过。

 

2.关于常量、指针常量的初步认识

const int a=100;
    int b=a;
    /*const int * const pa;//error
    第一个const定义的是pa所指向的变量为常量,其值不能改变,所以应在定义时初始化,否则以后不能初始化,但可以编译过去。
    第二个const定义的是指针pa为常量,其值不能改变,所以会报错。
    正确写法:const int * const pa=&a;
    */
    const int *pa;//此行只是定义pa指向的变量为常量,所以指针可以被赋值。
    pa=&a;
    //*pa=50;//error  此时pa所指向的变量a为常量,不能修改其值。
    //int *pb=pa;//error  指针pa所指向的变量为常量,而pb所指向的则是一个变量,其类型不一样,不能将两个不一样类型变量的地址赋值。
    const int *pb=pa;//此时将pb指向的变量定义为常量,则可以。
    cout<<*pa<<endl<<*pb<<endl;

 

3.C++的输入输出

cin、cout为类对象,scanf、printf为函数
对于实型,cout 默认输出六位有效数据。
setw()用于指定域宽,头文件为iomanip。
setiosflags(ios::left)用于左对齐输出。
setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的位数。n表示小数位数。
setfill("字符")用于指定字符填充,其为全局。

 

 注意 : 默认的cout输出是十进制,
           但当改变格式输出后,其默认则不再起效,输出格式变成最后的格式。
           当程序结束关闭再次打开时则还是默认为十进制输出。

    int a;
    cout<<"输入一个数:";
    cin>>a;
    cout
        <<"默认输出:"
        <<a<<endl;
    cout
        <<"十进制输出:"
        <<dec<<a<<endl;
    cout
        <<"八进制输出:"
        <<oct<<a<<endl;
    cout
        <<"十六进制输出:"
        <<hex<<a<<endl;
    cout
        <<"此时再用默认输出时,其默认输出指定为最后一次的格式输出"<<endl
        <<"默认输出:"
        <<a<<endl;
    cout
        <<"指定域宽输出:"<<endl
        <<setw(8)<<dec<<a<<endl;
    cout
        <<"左对齐输出:"<<endl
        <<setw(8)<<setiosflags(ios::left)<<a<<endl;

4. 函数重载

函数重载原则:函数名相同、函数参数表不同(参数类型、参数个数、参数顺序)
函数返回类型不同不能构成重载。
匹配重载函数原则:
严格匹配,找到则调用。
通过隐式转换寻求一个匹配,找到则调用。
注意:
int到long和double,double到int和float隐式类型转换
遇到这两种情况则会出现二义性导致错误。
重载的原理:利用倾轧技术,将函数名进行倾轧。
倾轧发生在两个阶段:.cpp编译阶段和.h的声明阶段,
只有两种阶段同时进行才能匹配调用。
避免倾轧的方法:在函数前加extern "C"

int print(int a)
{
    cout<<"参数是数字"<<endl;
    return 0;
}


int print(char b)
{
    cout<<"参数是字符"<<endl;
    return 0;
}

int print(char b,int a)
{
    cout<<"参数是字符、数字"<<endl;
    return 0;
}

int print(int a,char b)
{
    cout<<"参数是数字、字符"<<endl;
    return 0;
}

5.运算符重载

运算符重载:其本质就是定义了一个函数,用operator关键字定义。

struct COMP
{
    float real;
    float image;
};

COMP operator+(COMP one,COMP another)
{
    one.image+=another.image;
    one.real+=another.real;
    return one;
}

int chongzai()
{    
    COMP num1={1,2};
    COMP num2={3,5};
    COMP sum=num1+num2;
    cout<<"("<<sum.real<<","<<sum.image<<")"<<endl;
    return 0;
}

6.引用
1.引用没有定义,是一种关系型声明。
声明它和原有某一变量(实体)的关系。故而类型
与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2.声明的时候必须初始化,一经声明,不可变更。
3.可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
4.不能建立引用的引用,但可以对引用再次引用。【int &rb=ra】
可以对引用取地址【int *p=&ra】

常引用:
const 不可改变,不可通过指针或引用去改变。
const 对象的引用必须是const 的,将普通引用绑定到const 对象是不合法的。
const 引用可使用相关类型的对象(常量,非同类型的变量或表达式)初始化。

使用const的原因:
1,使用const 可以避免无意修改数据的编程错误。
2,使用const 可以处理const 和非const 实参。否则将只能接受非const 数据。
3,使用const 引用,可使函数能够正确的生成并使用临时变量(如果实参与引用参
数不匹配,就会生成临时变量)

int a=4;

const int b=5;
nt &ra=a;
//const int *p=a;//error const 对象的引用必须是const 的
const int &rb=b;
cout<<"a="<<a<<endl<<"ra="<<ra<<endl;
cout<<"b="<<b<<endl<<"rb="<<rb<<endl;

 

以上是关于C++学习笔记1的主要内容,如果未能解决你的问题,请参考以下文章

Unity2019.4.16f1c1 2d学习笔记 part1

Unity2019.4.16f1c1 2d学习笔记 part2

嵌入式学习笔记以及C++学习笔记更新计划

C++ 学习笔记

C++学习笔记IDE配置的学习笔记

C++学习笔记1