构造函数
来源:互联网 发布:淘宝网黄金首饰 编辑:程序博客网 时间:2024/06/06 01:30
---------------siwuxie095
关于类和对象的思考:
(1)实例化的对象是如何在内存中存储的?
(2)类中的代码又是如何存储的?
(3)代码和数据又有怎样的关系?
对象结构
要想说清对象是如何存储的,必须先了解内存中按照用途被划分的 5个区:
(1)栈区
定义的变量存储在栈区,其特点为:内存由系统进行控制,无论是分配
还是回收,都不需要程序员来关心
(2)堆区
如果分配内存时使用 new 运算符,则 new 出的内存存储在堆区,未来
必须使用 delete 来回收
(3)全局区
存储全局变量和静态变量
(4)常量区
存储字符串和常量
(5)代码区
存储编译之后的二进制代码
如:定义一个汽车类
在该类被实例化之前,不会占用栈 或堆中内存,但当它实例化之后,
每个对象都会在栈上开辟出一段内存,用来存储各自的数据,它们是
不同的变量,占据着不同的内存,而逻辑代码只编译出了一份,放在
代码区,代码区中的代码供所有的对象使用,谁需要它就去调用它,
找到相应的代码入口即可
注意:
当实例化 3个对象后,每个对象中的数据都是不可控的,都是未知的,
因为没有对这些数据进行初始化
如果没有初始化,就无法对这些数据进行预想的逻辑操作,
显然,必须对数据进行初始化
对象初始化
如:坦克大战中坦克出现位置的初始化
对于对象的初始化来说,不同的场合,有些只需要初始化一次,有些则要
根据条件初始化多次
初始化函数如何避免误操作而给程序带来的可能的灭顶之灾
为了帮助程序员避开这些风险,C++ 推出了构造函数:
(1)构造函数最大的特点即在对象实例化时被自动调用,通常只需要将
初始化的代码写在构造函数内,就能起到初始化数据的作用了。需要强调
的是,构造函数在实例化对象时被调用且仅被调用一次
(2)定义构造函数时,构造函数的名字要和类名同名
(3)构造函数也没有返回值
(4)构造函数可以进行重载
(5)实例化对象时,即便有多个构造函数,也仅用到其中一个构造函数
(6)当用户没有定义构造函数时,编译器将自动生成一个构造函数,
其中没有做任何的事情,为空
如:无参构造函数
再如:有参构造函数
再如:重载构造函数
程序:
Teacher.h:
#include <string>
using namespace std;
class Teacher
{
public:
//无参构造函数
Teacher();
//有参构造函数,这里给age了一个默认值20若name也给默认值
//则t1在实例化时就不知道该调用哪个构造函数,就不能通过编译
Teacher(string name,int age = 20);
void setName(string name);
string getName();
void setAge(int age);
int getAge();
private:
string m_strName;
int m_iAge;
};
Teacher.cpp:
#include"Teacher.h"
#include <iostream>
using namespace std;
Teacher::Teacher()
{
m_strName ="Jim";
m_iAge =5;
cout <<"Teacher()" << endl;
}
Teacher::Teacher(string name,int age)
{
m_strName = name;
m_iAge = age;
cout <<"Teacher(string name, int age)" << endl;
}
void Teacher::setName(string name)
{
m_strName = name;
}
string Teacher::getName()
{
return m_strName;
}
void Teacher::setAge(int age)
{
m_iAge = age;
}
int Teacher::getAge()
{
return m_iAge;
}
main.cpp:
#include<stdlib.h>
#include"Teacher.h"
#include<iostream>
#include <string>
using namespace std;
int main(void)
{
Teacher t1;
Teacher t2("Merry",15);
Teacher t3("James");
cout << t1.getName() <<" " << t1.getAge() << endl;
cout << t2.getName() <<" " << t2.getAge() << endl;
cout << t3.getName() <<" " << t3.getAge() << endl;
system("pause");
return0;
}
【made by siwuxie095】
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- 构造函数
- Redis主从复制 问题
- C++函数之类的构造函数与析构函数
- pytorch 学习笔记之编写 C 扩展
- 深入探索SpringApplication执行流程
- iOS开发技巧
- 构造函数
- [leetcode]: 496. Next Greater Element I
- The import com.ssh.service cannot be resolved
- java面向对象基本特征:封装、继承、多态
- 崇志宏 【转载】深度学文献阅读路径图---东南大学
- java中的字节流和字符流的区别是什么?
- 三、Hadoop的RPC框架运行机制
- web.鼠标.调用坐标函数
- 删除链表中重复的结点