c++面对对象基础知识

本文深入探讨C++中类的定义与使用,包括构造函数、析构函数、成员访问控制等内容,并介绍了如何利用成员函数、友元及运算符重载等特性进行高效编程。

一、类的定义格式

class calss_name
{
        private:
                data member declarations;
        public:
                member functions;

}


二、构造函数

1、在程序声明对象时,将自动调用构造函数

2、c++提供两种构造函数初始化对象的方式
显示调用构造函数:Person stucent = Person("张三","四川大学","大三",22);
隐式调用构造函数:Person studnet("李四","四川大学","大三",22);
构造函数与new
Person * pstudent = new Person("王五","四川大学","大三",22);
这条语句创建了一个person对象,其初始化为参数提供的值,并将改对象的地址赋值给pstudent指针,在这种情况下,改对象没有名称,但可以使用指针来管理改对象。
在构造函数构造对象之前,对象是不存在的,因此构造函数被用来创建对象,而不能通过对象来调用

三、析构函数

析构函数的作用:完成清理工作
如果构造函数使用new 分配内存,那么需要使用析构函数 delete释放内存
析构函数没有参数和返回类型,不能被重载

四、访问控制

1、c++的类中的成员变量的默认访问权限是private
2、c++中的struct默认访问权限是public

五、运算符

1、作用域解析运算符 :: 函数来使用
用来标识函数所属的类
2、直接成员运算符 . 对象来使用
用来直接调用对象的成员属性或者成员函数
3、间接成员运算符 -> 指向对象的指针使用
用来间接调用对象的成员属性或者成员函数

六、const成员函数

作用:
为了保证函数不会修改调用对象。
格式:
声明格式 返回值 函数名() const
定义格式 返回值 类名:函数名() const
只要类方法不修改调用对象,就应该声明为 const 成员函数

七、this指针

this指针指向用来调用成员函数的对象。一般情况下,所有的类方法都将this指针设置为调用它的对象的地址
比如 person是一个类,person p;
p.getName(),this指针指向的是p对象
如果方法需要引用整个调用对象,使用表达式*this

八、对象数组

        person p[5] = 
        {
                  person("张三",20,"男"),
                  person("李四",22,"男"),
                  person("王五",24,"男"),
                   ......
        };


九、类作用域

1、作用域为类的常量
方法一:在类的声明中声明一个枚举,这种方法声明的枚举并不会创建类数据成员,也就是说,所有的对象都不包括枚举。同时,不需要提供枚举名称。

        class bakery
         {
                private:
                        enum {months = 12};
                        double costs[month]; 
        };


方法二:static

        class bakery
         {
                private:
                        //enum {months = 12};
                        static const int month = 12;
                        double costs[month]; 
        };


2、c++ 11作用域内枚举

enum egg {small,medium,large};
enum t_shirt {small,medium,lager};
这样无法通过编译,因为命名冲突

c++ 11 提供的解决机制:
enum class egg {small,medium,lager};
enum class t_shirt {small,medium,lager};
也可以使用struct 代替class,然后使用枚举名限定枚举量
egg choice = egg::large

十、使用类

1、运算符重载

格式:返回值 operatorop(argument list)
比如:operator+(),operator[]()

2、友元

1、友元有三种
友元函数
友元类
友元成员函数
2、创建友元函数
声明:
friend Time operator*(double m,const Time & T); (Time是一个类)
虽然函数是在类声明中声明的,但不是成员函数,也不能使用成员运算符调用
虽然不是成员函数,但他与成员函数的访问权限相同(可以访问私有成员 变量)
定义:
Time operator*(double m,const Time & T)//不需要friend
{
}
3、常用的友元
<<运算符重载

        friend void operator<<(std::ostream & os, const Person & p);
        
        void operator<<(std::ostream & os, const Person & p)
        {
                os<< p.name <<"\t"<< p.age << endl;
        }



4、友元函数不受访问权限的限制
1)友元函数可以访问类的private,protected,public的所有字段属性
2)友元函数被放在类的任何位置,结果一样
3)友元类

3.1、如果某类B的成员函数频繁的存取另一个类A的数据成员,而A的数据成员peivate/protected限制造成B存取的麻烦,B只能通过A的public的成员接口间接存取

3.2、把B做成A类的友元类,即A类向B类开放其private/protected内容,让B直接存取

3.3、友元类:一个类可以做另一个类的友元,友元类的所有成员函数都是另一个类的友元函数

3.4、定义 friend class class_name;

十一、类和动态内存分配

1、特殊成员函数

1、c++默认提供一下成员函数
默认构造函数(如果没有定义构造函数)
默认析构函数(如果没有定义构造函数)
复制构造函数(如果没有定义构造函数)
赋值运算符(如果没有定义构造函数)
地址运算符(如果没有定义构造函数)
2、复制构造函数(拷贝构造函数)
作用:用于将一个对象复制到新创建的对象中,它用于初始化过程中,而不是常规的赋值过程中。
一般的原型如下:
ClassName(const ClassName & obj);
2.1何时调用?
新建一个对象并将其初始化为同类现有对象时,复制构造函数将被调用
程序生成对象副本时,包括参数按值传递时
按引用传递参数时,不会调用复制构造函数
2.2有何作用?
默认的复制构造函数逐个复制非静态成员
3、c++ 11提供的另外两个特殊的成员函数
移动构造函数
移动赋值运算符
4、带参数的构造函数也可以是默认构造函数------------->当所有的参数都有默认值。但是只能有一个默认构造函数
5、当定义了构造函数,c++不会定义默认构造函数
6、如果类的数据成员是char* s类型的字符串

Person(const char* s);
Person::Person(const char* s)
{
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
}

Person::~Person()
{
delete[] str;
}


7、成员初始化列表

1、Person(std::string name, unsigned int age) :name("weixuan"),age(20){}
这种格式只能用于构造函数
必须用这种格式来初始化非静态const数据成员
必须用这种格式初始化引用数据成员
2、 不能在类声明中初始化静态成员变量
例外情况:静态数据成员是整型或者枚举型const

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值