C++输入输出、构造析构函数

1.标准输入输出
cin     表示标准输入,即stdin
cout    表示标准输出,即stdout
clog    表示标准错误,带缓冲的标准错误
cerr    表示标准错误,即stderr
​
hex表示十六进制,oct表示八进制,dec表示十进制(默认)endl为换行符
eg:cout << oct << 16 << endl;
​
::  作用域运算符
eg:std::cout,指的是cout来自于std这个名字空间
  
名字空间(namespace)
 eg:using   namespace   std;
可直接使用cout << oct << 16 << endl;
而不用std::cout << oct << 16 << std::endl;

2.函数重载
定义:
1.同一个函数名能够完成不同的功能(一个函数名可能存在多种定义)
2.函数重载允许使用同一个函数名定义多个不同的函数,
3.编译的时候会根据实际传递给函数的参数数量,类型,顺序去匹配不同的函数
​
函数重载的条件:
            1.在相同的作用域
            2.函数名相同
            3.参数列表不同(参数的数量,类型,顺序)
注意:要避免出现二义性
eg:int sum(int a=0,int b=0,int c = 0);
    int sum(int a,int b);
    ====>   sum(1,2);//产生二义性
    编译器不知道是应该以(1,2,0)作为参数调用第一个函数还是以(1,2)调用第二个函数
            
换名机制:
        eg:sum();
            sum(int a);
            sum(float);
使用 g++ -c X.cpp -o 1.o编译成二进制文件可以看到
    例如:_Zsum
         _Zsumi
         _Zsumf
​
混合编程:告诉编译器,此函数的调用方法按照C语言的方式调用(不对函数进行换名)
    eg:extern "C" void Func(int a[],int n);
    表示Func函数使用C语言方式调用
    
内联函数(inline):
        编译器在编译的时候,就会将该函数的函数体复制到函数的调用点
        节省函数调用的开销,提高程序运行的效率
        注意:内联函数不能太长
内联函数的基本思想是使用空间换取时间
        
3.面向对象编程
面向对象三个基本特征:
        封装(Encapsulation):数据隐藏,升级和维护更加简单
        继承(Inheritance):实现代码重用,提高开发效率
        多态(Polymorphism):实现接口重用,一个相同的接口,可以实现多种功能
        (抽象)
        
class类:
        使用变量来描述对象的属性,称为成员变量
        使用函数来描述对象的行为,称为成员函数
        public:公有的
            public修饰的成员(函数和变量),称为公有成员,在任何地方都可以直接访问
        private:私有的
            private修饰的成员(函数和变量),称为私有成员,只有本类的成员函数和友元函数才能访问
        protected:保护的
            protected修饰的成员(函数和变量),称为保护成员,只有本类的成员函数和友元函数和它的派生类才能访问(派生类就是“后代”的意思)
            
C++中struct和class的区别?
        1.默认情况下,class中的成员都是私有的,struct是公有的;
        2.class 这个关键字可以作为模板的参数,struct 这个关键字不行
        注意:C 语言中 struct 可以实现封装,但是不可以继承,多态
C++中的class与C中的struct有什么区别?
        1.C++的空结构体占一个字节的空间,C的空结构体不占空间
        2.C++真正类型有无成员都占一字节C中的结构体不是真正的类型,空间大小有内部成员决定
        

4.构造函数与析构函数
构造函数:创建一个新的对象的时候一定会调用并且自动调用.
    功能:专门用于对象的初始化工作,在类的对象创建时定义初始状态
    
特点:1.构造函数的名字和类名相同       类名()
    2.构造函数没有返回值类型,也不能写void,可以有参数(可以重载),参数可以设置默认值
    3.在创建对象的时候,自动调用,一定会调用,且只调用一次.不能通过已有对象手动调用构造函数
    4.如果一个类中没有显示的声明构造函数,编译器会自动的生成一个构造函数,自动生成的构造函数函数体为空
      类名(){}
      当自定义构造函数时,编译器就不会自动生成。
​
调用重载析构函数:
    eg:class Test
        {
            private:
                int a;
            public:
                Test();
                Test(int a);
    
        };
         Test t;        //这是创建一个Test类型的对象,调用无参构造函数
         Test t{100};   //这是创建一个Test类型的对象,调用有一个int参数的构造函数
         注意:谨防二义性
             构造函数的限制->不能被继承,不能说明为虚函数,不能显式调用,不能取构造函数的地址。
         
​
析构函数:
功能:专门用于对象的清理工作(例如:关闭文件,释放动态内存分配的空间....)
特点:
    1.析构函数的名字和类名相似  ~类名
    2.析构函数没有返回类型,且没有参数(不能设置默认值,不能重载)
    3.在对象销毁的时候自动调用且一定调用
    4.如果一个类中没有显示的声明析构函数,编译器会自动的生成一个空析构函数
    ~类名()
    {}
    
    在相同的作用域下面,先构造的对象,后析构
    
    
问题:
    1.什么时候需要手动的写出构造函数和析构函数?
            构造: 创建对象需要传参数
            析构: 成员对象有指针对象,该指针对象指向一块堆空间的时候
    
    2.如果构造函数的参数名与成员名相同,是否能够赋值成功
            编译无错误
            赋值: 局部名屏蔽成员名
        
    3.当A类对象中拥有一个B类对象的时候,创建和销毁A类对象时,A和B的构造函数是如何调用的?
        构造函数:
            先调用B的构造函数,在调用A的构造函数
        析构函数:
            先调用A的析构函数,在调用B的析构函数
​
    总结:如果一个类中有其他类的成员对象,先按照声明顺序依次调用成员对象的构造函数,最后在调用本类构造函数
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值