C++学习笔记01

命名空间
using namespace 引入整个命名空间
namespace表示命名空间的关键字类型;不同命名空间中的值不同;
namespace A{
a =10;
}
namespace B{
a = 20;
}
std表示iostream里的一个命名空间;如果想使用cout,endl这些标准输出,一定要引入std命名空间;
示例程序如图所示
#include <iostream>
namespace A
{
    int a = 10;
}
namespace B
{
    int a = 20;
    namespace C
    {
        struct person
        {
            char name[20];
            int age;
        };
    }
}
int main(void)
{
    std::cout<<"A::a = "<<A::a<<std::endl;
    std::cout<<"B::a = "<<B::a<<std::endl;
 
    B::C::person p1 = {
        "wang2",
        20
    };
    std::cout<<"B::C::p1.age = "<<p1.age<<std::endl;
    return 0;
}
 
运行结果如图所示
 
 
面向行的输入:cin.getline();
getline()函数将读取整行,它通过使用通过回车键输入的换行符来确认输入结尾。其第一个参数用来存储输入行数组的名称,第二个参数是要读取的字符数。
getline()会将换行符替换成空字符。
面向行的输入:cin.get();
get()函数的参数与getline()一致,不同的是,get()读到行尾时遇到换行符时便不再读取,并且把换行符留在队列中,因此第二次读取时遇到的第一个字符便是换行符,此时get认为已读到行尾,而没有发现可读取的内容,利用不带参数的get()可以读取下一字符(即使是换行符)
解决办法有如下:
    cin.get(name,SIZE);
    cin.get();
    cin.get(another,SIZE);
    
    cin.get(name,SIZE).get();
    cin.get(another,SIZE).get();
 
cin.getline(name,size).getline(name2,size);将连续读取两行;
 
cin读取输入时同样也会将换行符留在队列中,导致下一次读取输入无法进行,(cin>>xx).get()可以很好地解决这个问题;
 
小结
    cin>>xx: 接受一个字符串,遇“空格”、“TAB”、“回车”都结束;
    cin.get(字符变量名):用来接受字符;即使时空格也会接收;返回一个对象,而不是读取的字符
    cin.get(字符数组名,接受字符数目):接收字符串,可以接收空格,会把换行符留在队列中;
    cin.getline(字符数组名,接受字符数目):可以接收空格,遇换行符结束,并把换行符换成空字符;
    getline(cin,字符串名):需包含cstring头文件,可以接收空格;
C++对语言的增强
  • C++中定义结构体变量时可以不使用struct关键字;
  • 对函数传参的检验能力更严格,以及对函数返回值进行严格检查;
  • C++在C语⾔的基本类型系统之上增加了bool,C++中的bool可取的值只有true(1)和false(0), C++编译器会在赋值时将⾮0值转换为true, 0值转换为false,只占一个字节;
  • 不管给bool类型负任何非零值,其值都为1;
对三目运算符的增强
    int a = 10;
    int b = 20;
    (a < b? a:b) = 30;//此处取的是a的地址,等价于C语言中
    *(a<b?&a,&b) = 30;
  • 三目运算符作为左值,那么返回值不能有常量;
对const增强
  • C语言中可以通过指针的间接赋值改变所谓的const变量;而C++中不能通过指针间接改变const变量的值
  • 在C++中const修饰的常量必须初始化;
  • 当对const常量取地址时,会临时在栈上开辟一个临时空间,这个变量是匿名的,将匿名的地址赋给指针p;但*p改变的是临时的变量,并不能改变const常量
  • C语言中的const并不合适一个常量,是一个变量加了只读属性而已;而C++中的const是个真正的常量;
const和#define的区别:
  • define和const变量在编译的阶段不一样,define是预处理器,const是编译器;
  • define没有区域的区分,而const完全符合编译器的逻辑判断,有作用区域划分;
对枚举的增强
  • C语言对枚举的赋值,可以通过枚举的值,直接赋值;
C++字符串的输入使用getline(cin,str);
共用体(union)是一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型的值,因此公用体的长度为其最大成员长度。可以节省空间。
 
枚举(enum)
    enum ok {red,yellow,boy,girl}; 作为枚举常量,他们对应的值为0~3;
    只能将定义枚举时使用的枚举量赋值给枚举变量,枚举量是整型,可以提升为int型,但int型不能自动转换为枚举类型;
enum student{SPR,SUM,AUT,WIN};
    student s = SPR;
    s = 1;//报错C++中不允许,而C语言允许
  s = WIN;//必须通过枚举变量赋值;
    enum ok {red,yellow=9,boy=20,girl}
    red在默认情况下为0,后面没有初始化的枚举量将比前面的枚举量大1.因此girl的值21;
    每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任一个整数值赋给这个变量,即使这个值不是枚举值。
 
C++中的引用
//C++提供了另一种对变量的间接操作,就是使用引用
int a = 10;
int *p = &a;
int &b = a;//定义了一个引用b指向a,b此时就是变量a的别名;
b = 40;//此时a 的值也变成了40;
a = 30;//此时b 的值也变成了30;
规则
1 引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故 而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2 声明引用的时候必须初始化,一经声明,不可变更。
3 可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
4 &符号前有数据类型时,是引用。其它皆为取地址。
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/lzynxh1314/p/9419562.html