Bootstrap

C++之类的成员函数和构造函数

C++中的类的成员函数和构造函数

一、类的成员函数

函数声明

class 类名{
修饰符1:
	变量1类型 变量1名称;
	变量2类型 变量2名称;
	...
	变量N类型 变量N名称;
修饰符2:
	函数1返回类型 函数1名称();
	...
	...
	...
	函数N返回类型 函数N名称();
}

//例如:
class People{
public:
	string name;
	long secore;
public:
	void PlayGameSecore();
}

函数定义

返回类型 类名::函数名(){
	//函数操作
}
//例如:
void People::PlayGameSecore(){
	cout<<secore<<endl;
}
//"::"是作用域解析运算符

二、构造函数

构造函数特点
1.以类名作为函数名。
2.无返回值类型。

作用
1.初始化对象的数据成员。
2.类对象被创建时,编译器为对象分配内存空间并自动调用构造函数以完成成员的初始化。

构造函数的种类
1.无参构造
2.一般构造(重载构造)
3.拷贝构造

注意:
1.如果创建的类中未书写任何构造函数,系统会自动生成默认的无参构造函数(函数为空,什么都不做)。
2.如果书写了构造函数,系统就不会再自动生成默认构造;如果希望有一个这样的无参构造函数,需要自己显示地写出来。

一般使用构造函数进行成员变量地初始化。


三、带参构造函数

类名::构造(类型1 参数1,类型2 参数2,...){
	//相关代码
}

//例如:
Student::Student(string name,string desc){
	m_name=name;
	m_desc=desc;
}
Student* stu = new Student("张三","我要好好学习");
stu->ShowInfo();

例如:
Student.h

#ifndef STUDENT_H
#define STUDENT_H
#include<iostream>
using namespace std;


class Student
{
    public:
        //构造函数重载规则与普通函数重载相同
        Student();
        Student(string name,string desc);   //带参构造  也可以写作:Student(string ,string);
        Student(int age);                   //带参构造  也可以写作:Student(int);
        //如果构造函数中,只有一个是带 唯一 地参数,操作可简化

        /*
        例如这个代码中年龄,主函数可写:
        Student stu4 = 50;
        */
        virtual ~Student();

        void ShowInfo();

        string Getname() { return m_name; }
        void Setname(string val) { m_name = val; }
        string Getdesc() { return m_desc; }
        void Setdesc(string val) { m_desc = val; }
        int Getage() { return m_age; }
        void Setage(int val) {
            if(val<0){
                m_age=18;
            }else{
                m_age = val;
            }
        }

    protected:

    private:
        string m_name;
        string m_desc;
        int m_age;
};

#endif // STUDENT_H

Student.cpp

#include "Student.h"
#include<iostream>
using namespace std;
Student::Student()
{
    //ctor
    cout<<"默认构造"<<endl;
}

Student::Student(string name, string desc)
{
    m_name = name;      //等价写法:     Setname(name);
    m_desc = desc;      //等价写法:    Setdesc(desc);
    cout<<"调用带参构造:Student(string name, string desc)"<<endl;

}
/**
Student::Student(string name, string desc)还可以这样写:
//初始化参数列表的写法
Student::Student(string name, string desc):m_name(name),m_desc(desc)
{
    cout<<"调用带参构造:Student(string name, string desc)"<<endl;
}

*/
Student::Student(int age)
{
    m_age=age;          //等价写法:     Setage(age);
    cout<<"调用带参构造:Student(int age)"<<endl;
}

Student::~Student()
{
    //dtor
}
void Student::ShowInfo()
{
    cout<< m_desc <<m_name<<endl;
    cout<<"调用函数:ShowInfo()"<<endl;
}

main.cpp

#include<bits/stdc++.h>
#include "Student.h"
using namespace std;
int main()
{
    Student stu1;       //在栈内内存分配空间,速度非常快,但是放的东西少
    Student stu2("张三","我要好好学习");
    Student stu3(18);
    Student stu4=50;
    stu2.ShowInfo();

    Student* stu5 = new Student("李四","好好学习");      //分配内存的时候同时调用构造函数,堆内存分配空间,速度慢,但是放的东西多
    stu5->ShowInfo();
    return 0;
}




//打印结果:
/*

默认构造
调用带参构造:Student(string name, string desc)
调用带参构造:Student(int age)
调用带参构造:Student(int age)
我要好好学习张三
调用函数:ShowInfo()
调用带参构造:Student(string name, string desc)
好好学习李四
调用函数:ShowInfo()

*/
;