类
对于我这种cpp初学者,又使用过其他面向对象编程语言的人来说,c++的类的规则实在是太复杂了,在这里做一个整理
类的含义:抽象出现实中的实体,构建基本的属性和函数
类的组成:属性和函数
属性和方法有不同的修饰符
表示权限的 protected,public,private
表示静态的 static
静态变量:
static数据成员必须在类定义体的外部定义,且只能定义一次。
static数据成员不能再类定义体的内部进行初始化。
const static数据成员可以在类定义体内进行初始化,不是强制的。
static数据成员的类型可以是该成员所属类的类型
非static成员被限定声明为其自身类对象的指针或引用。
static数据成员可以作为默认实参,
非static数据成员不能用作默认实参,因为它的值不能独立于所属的对象而使用。
静态(static)函数:
static成员函数不能被声明为const
static成员函数不能并声明为虚函数。
static成员函数没有this指针,它可以直接访问该类的static成员,但不能直接使用非static成员。
static关键字出现在类定义体中函数的声明处,外部定义不出现)。
this指针
成员函数具有一个附加的隐含参数,即指向该类对象的一个指针this,与调用成员函数的对象绑定在一起。
普通的非const数据中this是一个const指针,可以改变值不能改变地址
const数据中this是一个const类型的const指针,不可以改变值不能改变地址
表示返回值或者函数本身状态的 const mutable
const 常量类型
在类中声明变量为const类型,但是不可以初始化
const常量的初始化必须在构造函数初始化列表中初始化,而不可以在构造函数函数体内初始化
const构造函数是不必要的
不能从const成员函数中返回指向类对象的普通引用,
const成员函数只能返回*this作为一个const引用。基于成员函数是否为const,可以重载一个成员函数。
mutalbe可变数据成员
mutable。永远不能为const,甚至当它是const对象的成员时也是如此。const成员函数可以改变mutable成员。
特殊的方法
构造函数,属性名()---用于初始化
必须在构造函数初始化的变量:
类的const常量
类的引用类型成员
没有默认构造函数的类类型成员
如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数
一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数了。
成员初始化的顺序就是在类中定义成员的次序。
析构函数--用于释放内存等
友元方法:
允许访问类的私有方法
属性
可以是常量,union,enum,struct ,object
类的调用有三种方式:
值 作用域范围类存在,作用域外被释放,释放时调用析构函数
引用 跟被引用对象有关
指针 需要手动删除
//main.cpp
#include <iostream>
#include "Books.h"
using namespace std;
int main(int argc, const char * argv[]) {
cout <<"start:";
Books b("孤独深处","郝景芳",11);
//Books b();//error
b.showData();
return 0;
}
//Books.h
//
// Books.h
// cpp_class
//
// Created by bikang on 16/9/1.
// Copyright (c) 2016年 bikang. All rights reserved.
//
#ifndef __cpp_class__Books__
#define __cpp_class__Books__
#include <iostream>
class Platform{
public:
int publish_year;
std::string online_time;
Platform(int p,std::string o);
};
class Books{
private:
const Platform platform;
double price;
static int initTime;
const static int astatic_data = 11;
public:
int buy_time;
std::string name;
std::string author;
const int const_data;
//const Platform& getPlatForm();
Books(std::string name,std::string author,int buy_time=astatic_data);
const static int getInitTime();
void showData();
~Books();
};
#endif /* defined(__cpp_class__Books__) */
//Books.cpp
//
// Books.cpp
// cpp_class
//
// Created by bikang on 16/9/1.
// Copyright (c) 2016年 bikang. All rights reserved.
//
#include "Books.h"
//#include <iostream>
Platform::Platform(int p,std::string o):publish_year(p),online_time(o){};
int Books::initTime = 0;
Books::Books(std::string name,std::string author,int buy_time):buy_time(buy_time),name(name),author(author),const_data(11),platform(buy_time,name){
std::cout << "start";
}
void Books::showData(){
std::cout <<"show data";
std::cout << this->name << this->author << this->buy_time <<std::endl;
}
Books::~Books(){
}
/*
/error
const Platform& Books::getPlatForm(){
return &(this->platform);//error
}
*/