C++ :类 和 对象 ※重点※(一)

简介: C++ :类 和 对象 ※重点※

默认成员函数:

  默认成员函数分为6种,他们都是如果我们不写,编译器会自动生成的函数,如果写了,编译器就不会生成了

ec4779b4f58e43eabdac71f59c5670c4.png前面四个是非常重要的,后面两个用得不多


构造函数:

  我们在平常写一个类得时候,就怕我们没有给他进行初始化,我们再去访问就是随机值了,怎么解决这种不确定性呢,这个时候我们得默认构造函数就出来了


构造函数的特性:

构造函数是一种特殊的成员函数,构造函数的主要任务不是去创建对象,而是去初始化对象。

  1. 函数名与类名相同。
  2. 没有返回值。
  3. 对象实例化的时候会自动调用构造函数
  4. 可以重载


这些是构造函数的特性,来看看他写出来是什么样吧:

class stu
{
public:
  stu()
  {
    _a = 10;
    _c = 'A';
    _b = 20;
  }
  stu(int a, char c, int b)
  {
    _a = a;
    _c = c;
    _b = b;
  }
  void test1()
  {
    cout << _a << "-" << _c << "-" << _b << endl;
  }
private:
  int _a;
  char _c;
  int _b;
};

  这里就是一个重载,构造函数的参数也是可以加缺省值的,建议呢是全部都加上缺省值,这样也可以防止传参的时候写错而出些错误(注意给缺省值的顺序是从右往左给的)


如果你想调用一个不用传参的构造函数,定义的时候应该是这样的:

class stu
{
public:
  stu()
  {
    _a = 10;
    _c = 'A';
    _b = 20;
  }
  stu(int a, char c, int b)
  {
    _a = a;
    _c = c;
    _b = b;
  }
  void test1()
  {
    cout << _a << "-" << _c << "-" << _b << endl;
  }
private:
  int _a;
  char _c;
  int _b;
};
int main()
{
  stu s1;
  stu s3(4, 'C', 40);
}

  大家看见没有,这里是不需要加括号的,加上括号反而会出错,编译器会认为你定义那里并没有定义出一个对象,无法区分是一个函数的声明还是对象的定义;传参的时候也是在对象的后面直接传参的。


 还有一个小小的细节:我们的全缺省的构造函数和自己写的无参的构造函数不要同时存在,虽说他们在语法上,不使用这个类,是可以编译通过的,但是一旦我们使用,用这个类定义一个不传参的对象,这就会报错了,因为两个构造函数都是可以不用传参可以直接调用的,编译器这个时候就不知道用哪个了,然后就报错了

所以我平常写的时候,如果有需要,都是定义为全缺省的,既方便也不容易出错


内置、自定义类型?

我们要学习默认构造函数,就要知道内置类型和自定义类型,内置类型就是我们平常经常用的那些类型,自定义类型顾名思义就是我们自己定义的类型

我们编译器默认生成的构造函数对内置类型不做处理,对于自定义类型会去调用它的构造函数:

class date
{
public:
    date()
    {
        _a=100;
    }
private:
    int _a;
};
class stu
{
public:
  void print()
  {
    cout << _a << "-" << _c << "-" << _b << endl;
  }
private:
  int _a;
  char _c;
  int _b;
    date a1;
};
int main()
{
  stu s3
}

8551fc52690e425c9550318aeb72880c.png

 对于初始化是区分化处理的,我的内置类型得不到初始化除非自己显示得去写,大家有没有觉得挺奇怪的呢?所以有了一个这样的总结:

  如果一个类中的成员全是自定义类型,我们就用自己默认生成的就够了,有内置成员、或者要显示传参,就要自己写了。


对于这种处理方式呢,后面在c++11里面给了一个解决办法就是这样:

class date
{
public:
    date()
    {
        _a=100;
    }
private:
    int _a;
};
class stu
{
public:
  void print()
  {
    cout << _a << "-" << _c << "-" << _b << endl;
  }
private:
  int _a = 10;
  char _c = 'A';
  int _b = 20;
    date a1;
};
int main()
{
  stu s3
}

这里给的不是一个赋值,这里依旧只是声明,我们给的值是一个缺省值,是给我们构造函数的初始化列表使用的,如果我们我自己写了构造函数,并给内置类型赋值了,就不会用这些给的缺省值了,大家学到后面初始化列表就知道怎么回事了


 构造函数的小细节:

一:

我们自己写的构造函数对于自定义类型也是会处理的

93665f1d9cc145159d242016a8c28f64.png


二:  

  注意:无参的构造函数和全缺省的构造函数也是可以叫做默认构造函数的(他们和编译器默认生成的都是不需要传参的),但是默认构造函数只能有一个且必须有一个(也可以是半缺省)六大成员函数包括编译器自动生成的默认构造,我们上面说过无参的和全缺省的不能写在一起报错就是这样的:

04dba9843d2e4040b38afceecf31bfb3.png


三:

   没有默认构造可用的情况就是这样的:

class stu
{
public:
  stu(int a ,char c='A',int b=20)
  {
    _a = a;
    _c = c;
    _b = b;
  }
  void print()
  {
    cout << _a << "-" << _c << "-" << _b << endl;
  }
private:
  int _a;
  char _c;
  int _b;
};
int main()
{
  stu s1;
}

 这里就是编译器因为你自己写了,就没有生成默认的,但是你自己写的,你也没用,就报错了!!!

目录
相关文章
|
2天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
42 30
|
16天前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
16天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
16天前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。
|
16天前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
|
29天前
|
存储 算法 编译器
c++--类(上)
c++--类(上)
|
1月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
1月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
16天前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
25天前
|
存储 C++
C++ dll 传 string 类 问题
C++ dll 传 string 类 问题
16 0