• c++ 类注意点


    1.类构造函数的参数名不能与类成员名相同;构造函数没有返回值和类型;

    2. 显示调用构造函数、隐式调用构造函数:

    Stock food=Stock(....);//显式
    Stock food(....);//隐式
    Stock *pstock=new Stock(....);//对象指针
    

    3. 无法使用对象来调用构造函数;

    4.默认构造函数的注意点:

    ①隐式调用构造函数:

    Stock stock;//注意不要写成stock(),这要会变成一个返回对象的函数!
    

    如果没有提供任何默认构造,则c++自动提供默认构造函数的隐式版本,不会做任何构造工作:

    Stock::Stock(){}
    

    ②定义默认构造函数的方法:

    <1> 提供默认值; <2>函数重载;p354.

    ③一定注意不要写成声明函数:

    Stock second();//错误的类构造初始化,其实是声明返回Stock对象的函数!
    

    5 析构函数

    ①析构函数负责对new的内存进行delete,如果没有使用new,则析构函数没有需要完成的任务!这种情况下只需让编译器生成一个隐式析构函数即可。

    ②析构函数没有参数;

    ③p359 10.6 对临时对象的理解!

    6. const 成员函数:只要类方法不修改调用对象,则应声明为const:

    void show() const;//声明
    void Stock:: show() const;//定义

      注意,在此处的const,其实是对this指针的const,也就是调用对象的const!!p365

    7.类作用域

    ①作用域为类的常量:

    类声明中不能包含类似于const int var=12的表达式,因为声明只是描述了对象,并没有创建对象,也就没有存储变量的空间;p371

    解决这种问题可以用<1>枚举做符号替换;<2>在类声明中使用static const int Months=12;

    ②作用域内枚举,解决两个枚举中枚举变量名相同的冲突问题;p372

    enum class egg {Small,Medium,Large};
    enum class tshirt {Small,Medium,Large};
    
    //解决conflict问题 egg choice=egg::Large tshirt floyd=tshirt::Large

    8. 友元函数解决重载运算符的2.5*B的问题,即对象在后无法使用重载运算符成员函数的问题;p392

    友元函数与重载运算符相辅相成!

    9  类的自动转换和类的强制类型转换 p419

    ①类的自动转换是指:把一个数值赋值给一个只有一个参数(或者有其他默认参数)的构造函数的类。在构造函数声明中使用explicit可防止隐式转换。

    ② 类的强制类型转换是指:利用重载运算符函数(operator int等),把一个类赋值给对应类型的数值型变量;关于转换函数的注意事项,参看p416

    ③关于类的自动转换与重载+,- 等运算符共存时的注意事项:当double位于二元运算符左侧时,类成员函数版本的+重载是不能自动转换为类对象的,解决方法参看p421

    10 类的静态成员与静态成员函数

    ①静态成员:p426 ,所有对象共享一个静态成员。关于如何初始化静态成员变量,参看p428 and 菜鸟教程

    11 类中的拷贝构造函数 p433

    ①何时调用:新建一个对象并将其初始化为同类现有对象时;具体的说,当函数按值传递对象或者函数返回对象(p449 12.4.1)时,都会使用复制构造函数。

    因为按值传递对象将会调用复制构造函数,因此应该按引用传递对象,这样可以节省调用复制构造函数的时间以及存储新对象的空间。

    StringBad ditto(motto);
    StringBad metoo=motto;
    StringBad also=StringBad(motto);
    StringBad *pStringBad=new StringBad(motto);
    

     ②默认的复制构造函数的功能:

    <1>会逐个复制非静态成员(成员复制被称为浅复制);

    <2>如果成员本身是类对象,则会调用这个类的复制构造函数;

    <3> 静态成员不受影响,因为其属于整个类;

    ③ 浅拷贝与深拷贝的区别

    <1>浅拷贝:在复制构造函数中拷贝的是成员的值,如果是指针的话,则是同一地址,这样在析构时会导致一个内存空间被释放两次,产生不可预知的错误;

    <2>深拷贝:在复制构造函数中,对于指针变量,对应new出来存储空间以存储对应的变量的值。p435

    <3> 深拷贝的实现:可以通过拷贝构造函数;也可以通过重载运算符=;两者有一些差别,具体实现参看p437;

      具体来说,拷贝构造函数用于上列4种情况时发挥作用:

    StringBad ditto(motto);
    StringBad metoo=motto;
    StringBad also=StringBad(motto);
    StringBad *pStringBad=new StringBad(motto);
    

      而重载operator=是用于下列情况,即先通过默认构造函数初始化类,然后再赋值已存在的对象时:

    String name;
    char temp[40];
    cin.getline(temp,40);
    name=temp;
    

     

    12. new,delete对象时,将调用对象的构造函数(或者拷贝构造函数),析构函数。p454。new会返回开辟的地址

    13. 对象的定位new运算符:

    ①一般new对象时,会返回对象占用内存的地址给指针,这样配合使用delete可以释放对应的内存;

    ②而使用new(buffer)时,不会返回地址,而地址就是buffer指针指向的地址,这时要用delete [],注意带[]。而且定位new运算符不会调用对象的析构函数。p457

    ③对于new定位运算符,需要显式调用析构函数来释放对象!p459

  • 相关阅读:
    HDU-2502-月之数
    C语言的位运算的优势
    HDU-1026-Ignatius and the Princess I
    HDU-1015-Safecracker
    HDU-1398-Square Coins
    HDU-1028-Ignatius and the Princess III
    背包的硬币问题
    HDU-1527-取石子游戏
    HDU-1996-汉诺塔VI
    css中的选择器
  • 原文地址:https://www.cnblogs.com/liutianrui1/p/13375758.html
Copyright © 2020-2023  润新知