c++面对对象基础知识
2015-04-10 15:29
316 查看
一、类的定义格式
二、构造函数
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
八、对象数组
九、类作用域
1、作用域为类的常量
方法一:在类的声明中声明一个枚举,这种方法声明的枚举并不会创建类数据成员,也就是说,所有的对象都不包括枚举。同时,不需要提供枚举名称。
方法二:static
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、常用的友元
<<运算符重载
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类型的字符串
7、成员初始化列表
1、Person(std::string name, unsigned int age) :name("weixuan"),age(20){}
这种格式只能用于构造函数
必须用这种格式来初始化非静态const数据成员
必须用这种格式初始化引用数据成员
2、 不能在类声明中初始化静态成员变量
例外情况:静态数据成员是整型或者枚举型const
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
相关文章推荐
- C++面向对象基础知识详解二
- C++面向对象基础知识详解三
- PHP面对对象入门基础知识积累
- C++ 面向对象基础知识点
- C++面向对象基础知识详解一
- JAVA基础知识:面对对象特性【继承】【 多态】【 封装】【 接口】
- C/C++基础知识总结——类与对象
- C++面向对象基础知识
- c++面向对象基础知识 Day 3
- [C++基础 面对对象的一些知识]
- c++之基础知识(1)定义类的对象;析构函数和构造函数常用模板
- 【C++】类和对象--基础知识+四个默认成员函数+运算符重载
- C/C++面向对象基础知识面试易考点
- C++ 基础知识点 七 第8章 类和对象的创建
- 【C++面向对象学习笔记】-基础知识
- php基础知识:类与对象(3) 构造函数和析构函数
- C++学习(4)--基础知识(4)--关于const
- php基础知识:类与对象(2) 自动加载对象
- java基础学习---java对象序列化基础知识
- php基础知识:类与对象(2) 自动加载对象