当前位置: 代码迷 >> 综合 >> C++ 基础 一 类, 构造函数, 初始化列表 new explicit
  详细解决方案

C++ 基础 一 类, 构造函数, 初始化列表 new explicit

热度:45   发布时间:2023-12-24 03:38:17.0

c++的类

  1.编写一个.h文件     包含成员变量,方法(声明)       默认构造函数 ,析构函数

#pragma once
using namespace std;
class Person
{
public:Person() {cout << "c++的构造函数" << endl;};~Person() {cout << "c++的析构函数函数" << endl;};void setName(string pname);string getName();void printName();private:string name;            };

  2.编写一个实现类       导入.h文件           并实现其中的方法        : :表示类作用域    

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include"Person.h"void Person::setName(string pname) {name = pname;
}string Person::getName() {return name;
}
void Person::printName() {cout << name << endl;                }

3.测试输出结果

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include"Person.h"
using namespace std;int main(void) {Person p;p.setName("wyc");cout << p.getName() << endl;   } c++的构造函数    wyc        c++的析构函数函数

2.构造函数

  1.构造函数:  默认构造函数不需要加括号执行   列如 Person p; 就会执行默认的           但是Person  p()  不会,认为是函数的声明

class Person
{
public:Person() {cout << "无参构造函数" << endl;};Person(int age) {cout << "有参构造函数" << endl;};Person(const Person &p) {m_age = p.m_age;cout << "拷贝参构造函数" << endl;};~Person() {cout << "析构函数" << endl;};private:int m_age;                };

   2.Person(100)   称为匿名对象 ,会在这句话结束后释放这个对象,所以析构函数在这句话之后立即执行   

    3.Person p = Person(20)  而这种是随栈区而销毁        4.不能使用 拷贝构造初始化匿名对象,列如   Person( p1)

   5.Person  p2 = 100;   相当于调用有参的构造  Person  p2 = Person(100);   Person p3 = p2 相当于 Person p3 = Person(p2)

    系统默认给的:  无参构造函数  拷贝函数   析构函数    如果自己提供 普通构造,系统不再提供,默认无参,但是还是有

     如果自己提供拷贝,系统不会再提供任何默认构造函数

3.深拷贝浅拷贝

4.初始化列表

   使用下列写法,初始化多个成员变量

class Person {
public:Person(int a, int b, int c) :p_a(a),p_b(b),p_c(c){}int p_a;int p_b;int p_c;            };

5.类作为成员变量

   1.调用顺序:  先调用 Phone的默认构造函数,再是Game类的, 再是自己的析构函数,再是 Phone的析构再是Game

class Person {Phone p;Game g;};class Phone
{
};class Game {};int main() {Person p;return 0;            }

6.explicit关键字

1.如果在构造函数前加上这个,那么就可以防止隐式类型转换,列如Person p = "name" 会报错 ,相当于Person p = Person ("name");

 7.new 关键字

   1.new 关键字就相当于 第一句话

Person* p1 = (Person*)malloc(sizeof(Person));    等于
Person* p2 = new Person;

   1.之前  Person p;   这是在栈区开启的空间,函数结束会释放执行 析构函数        使用new 关键字存放在堆区,不会执行析构函数

  malloc 返回void * 使用需要强转,  不会调用默认构造,          使用new 出来的 使用 delete p     释放对象 执行析构函数

  2. new 出来的是一个指针

  3.new 开启数组         new Person [10] 执行10次构造 ,     new 数组必须有默认构造方法       delete [10] P

  相关解决方案