第18课构造函数(中)

带有参数的构造函数(可以使每个对象有不同的初始化状态)
  构造函数可以根据需要定义参数
  一个类中可以存在多个重载的构造函数
  构造函数的重载遵循C++重载的规则
class Test
{
public:
  Test(int v)
  {
    //use v to initialize member
  }
}

友情提示
对象定义和对象声明不同
  对象定义——申请对象的空间并调用构造函数
  对象声明——告诉编译器存在这样一个对象
  

  Test t; //定义对象并调用构造函数

int main()
{
  //告诉编译器存在名为t 的Test对象
  extern Test t;

  return 0;
}

构造函数的自动调用
class Test
{
public:
  Test() {   }
  Test(int v) {   }

};

int main
{
  Test t;           //调用Test()
  Test t1(1);    //调用Test(int v)
  Test t2 = 1;  //调用Test(int v)

  return 0;
}
Test t1(1)解析:
定义一个Test 对象,名字为t1。圆括号里面有个立即数1,看上去很像函数调用。其实它用来告诉编译器
要调用带有参数的构造函数,调用哪个带有参数的构造函数呢?这时候就需要利用重载的规则了。
立即数1的类型为int,所以就告诉编译器所要调用的构造函数,它只有一个参数,并且参数的类型为int.在这个地方就是Test(int v)

 1 #include <stdio.h>
 2
 3 class Test
 4 {
 5 public:
 6     Test()
 7     {
 8         printf("Test()\n");
 9     }
10     Test(int v)
11     {
12         printf("Test(int v), v = %d\n", v);
13     }
14 };
15
16 int main()
17 {
18     Test t;      // 调用 Test()
19     Test t1(1);  // 调用 Test(int v)
20     Test t2 = 2; // 调用 Test(int v)
21
22     int i(100);  //用100来初始化i。相当于int i =100;
23
24     printf("i = %d\n", i);
25
26     return 0;
27 }

注意:
Test t2 = 2; //用2来初始化t2
int i = 1; //用1对变量就进行初始化

i = 2; //用2对变量i进行赋值
以前在学习C语言时,初始化和赋值好像没有什么差别,于是就将赋值和初始化混淆了。
在C语言中,两者貌似差距很小。但是在C++中,两者之间的差异很大。原因是初始化会调用构造函数。

一定要记住,初始化会调用构造函数,赋值时调用的就不是构造函数了。赋值的时候究竟发生了什么?以后再说。

原文地址:https://www.cnblogs.com/-glb/p/11762176.html

时间: 2024-08-02 23:55:10

第18课构造函数(中)的相关文章

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform)让用户方便的操作数据库中的数据. 什么是ADO.NET 是一组库类,System.Data. Ado.net组成 Connection:用来连接数据库 Command:用来执行SQL语句 DataReader:只读.只进的结果集,一条一条读取数据(SteamReader.XmlReader) Da

什么时候需要在类的构造函数中使用初始化列表

1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中Elem4 2,如果类的成员变量中含有const成员变量,如果不使用列表,在构造函数中是不能对其赋值的,会导致编译失败.下例中b 3,如果类的成员变量中含有引用,引用必须被初始化.下例中c 4,需要提高效率的时候,如果不使用初始化列表,而放在构造函数体内赋值的方法,则变量先被默认构造函数初始化,然后又

C++中默认构造函数中数据成员的初始化

构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据成员没有在构造函数中显示初始化,将执行默认初始化: 1.对于内置类型(如int,double,char,bool等)和复合类型(数组,指针),定义任何函数体之外的内置类型或复合类型变量将被初始化0,对于函数体内的内置类型的对象,若没有初始化,其值是未定义的. 2.具有类类型的成员通过运行各自的默认构

C/C++ -- Gui编程 -- Qt库的使用 -- 构造函数中添加组件

在构造函数中定义一个标签,设置自动换行和样式表 -----mywidget.cpp----- 1 #include "mywidget.h" 2 #include "ui_mywidget.h" 3 #include <QLabel> 4 5 MyWidget::MyWidget(QWidget *parent) : 6 QWidget(parent), 7 ui(new Ui::MyWidget) 8 { 9 ui->setupUi(this);

在拷贝构造函数中为什么可以访问引用对象的私有变量? [问题点数:0分]

在拷贝构造函数中为什么可以访问引用对象的私有变量? 例如: class Point { public:         Point(int xx=0,int yy=0){X=xx;Y=yy;}         Point(Point &p); private:         int X,Y; }; Point::Point(Point &p) {         X=p.X;         Y=p.Y; } 更多 0 分享到: 相关主题推荐: 对象 class yy x 相关帖子推荐:

数据-第18课-栈与递归

第18课-栈与递归 C语言中的疑惑 讨论中…… 小A:C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗? 小B:我觉得应该没关系吧 :我觉得应该没关系吧,只是名称碰巧一致而已吧?! 1. 函数调用时的栈 (1)程序中的“函数调用栈”是栈数据结构的一种应用. (2)函数调用栈一般是从高地址向低地址增长的. l  栈底为内存的高地址处. l  栈顶为内存的低地址处. (3)函数调用栈中存储的数据为活动记录 2. 活动记录 活动记录是函数调用时一系列相关信

C++--第16课 - 继承中的构造与析构

第16课 - 继承中的构造与析构 1. 赋值兼容性原则 (1)      子类对象可以当作父类对象使用. (2)      子类对象可以直接赋值给父类对象. (3)      子类对象可以直接初始化父类对象. (4)      父类指针可以直接指向子类对象. (5)      父类引用可以直接引用子类对象. 子类就是特殊的父类 #include <cstdlib> #include <iostream> using namespace std; class Parent { pro

Spark3000门徒第9课IDEA中开发Spark实战总结

今晚听了王家林老师的第9课IDEA中开发Spark实战,课后作业是:在Idea中编写广告点击排名的程序并提交集群测试, IDEA社区版本就够用,Ultimate没必要还要钱 程序如下: object WordCountCluster { def main(args: Array[String]){ /** * 第一步:创建spark的配置对象SparkConf,设置Spark程序的运行时的配置信息 * */ val conf = new SparkConf() //创建SparkConf对象 c

javascript 构造函数中的属性与原型上属性优先级的比较

备注: 下面这个问题是我前天看书上发现的. 按照我以前的理解, a.rename()这个方法传什么值,结果都会弹出 小a,但我看书上的demo 弹出的是大A.... 我的困惑是:  js的构造函数中的属性与方法, 不是比原型对象上的属性与方法优先级要高吗?为什么会弹出的是大A? PS: 小弟很想有人能用通俗易通的语言, 简单的描述下,为什么会弹出的是 A, 而不是小 a.在此谢谢了  function F(name) { this.name = name; } var a = new F("a&