c++教程(二)Object C++

本文介绍了C++中的类定义、构造函数与析构函数,详细讲解了转换构造函数、初始化列表、拷贝构造及深拷贝与浅拷贝的概念。还探讨了类默认生成函数、运算符重载(如operator=、operator+、++)、友元、static成员以及const在类中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.类定义

c++类的定义是通过class或者struct关键字实现,两者都是一样的,只不过class默认成员是私有,struct默认是公有。

class MyString{};

访问权限:private,public,protected

2.构造函数和析构函数

构造函数名和类名是一样的,而且没有返回值

class MyString
{
public:
    MyString(); //构造函数
    ~MyString(); //析构函数
};

定义对象时候,会调用构造函数,无论是用new 定义还是直接定义;

int main()
{
    MyString str1;
    MyString* str2 = new MyString;
}

这两种方式都会调用构造函数

(1)转换构造函数
class MyString
{
public:
    MyString();
    MyString(char *str); //转换构造函数
}

int main()
{
    MyString s = "hello world"; //这里调用的就是转换构造函数
    s = "hello"; //先会调用转换构造函数,新建个临时对象,然后再通过赋值
    return 0;
}

这里其实是一种隐式转换,如果你不想进行隐式转换,可以在函数名前加上explicit关键字。

(2)初始化列表

构造c++对象的时候,可以通过初始化列表对对象的成员变量进行初始化。

MyString::MyString() : _len(0) //初始化列表
{}

类中的const,引用这些都是无法赋值的,必须通过初始化列表初始化。

(3)拷贝构造

拷贝构造就是用该类的其它对象来初始化本对象。

MyString(const MyString& s); //拷贝构造函数
(4)深拷贝和浅拷贝

默认拷贝构造函数是浅拷贝,MyString类中肯定包括一个char*的指针,浅拷贝就是只拷贝指针,并没有拷贝数据。

MyString::MyString(const MyString& str)
{
    int len = strlen(str);
    if ((m_len + len) < m_capacity)
    {
        memcpy(m_str + m_len, str, len);
        m_len += len;
        m_str[m_len] = 0;
        return *this;
    }

    char* p = new char[m_capacity * 2];
    memset(p, 0, m_capacity * 2);
    memcpy(p, m_str, m_len);
    delete[]m_str;
    m_str = p;
    m_capacity *= 2;
    return operator+=(str);
}

3.类默认生成函数

一个空的c++类,会有以下6个默认函数

class MyString
{
public:
    MyString(); //构造函数
    MyString(const MyString& s); //拷贝构造函数
    ~MyString(); //析构函数
    MyString& operator=( const MyString& ); // 赋值运算符
    MyString* operator&(); // 取址运算符
    const MyString* operator&() const; // 取址运算符 const
};

4.运算符重载

单目运算符重载为成员函数
双目运算符重载为友元函数,.=()[]->无法重载为友元。
大多数运算符都可以重载,但是以下运算符不能重载:

.  (成员访问运算符)
.*  (成员指针访问运算符)
::  (域运算符)
sizeof  (长度运算符)
?:  (条件运算符)
(1)operator=
    MyString& MyString::operator = (const char* str)
    {}

有的时候我们需要能够实现连续=,这时候我们必须返回MyString&

(2)operator+
MyString MyString::operator + (const char* str);

这里我们调用的时候,只能这样调用:

MyString str;
str + "hello";
"hello" + str;//这样调用会报错

如果我们需要这样调用,我们可以实现一个友元函数:

MyString operator+(const char* str, const Mystring& ms);
(3)++

++重载分为两种,i++和++i,如何来区分这两种重载呢?

operator++(int):代表i++
operator++():代表++i
(4)<<
<<重载需要写成友元函数,例如:
ostream& operator<<(ostream& out, const MyString& str);
(5)operator int
(6)operator new

new 是先分配空间,后调用构造
delete是先调用析构函数,后销毁空间

5.友元

6.static与类

成员变量:
被对象共享,但是不属于对象;
类名可直接访问
成员函数:
没有this指针(没法访问非静态成员,变量,函数)

单例模式:

const与类

const函数与非const函数能构成重载

一般会用非const版本,去调用const版本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值