一些C++笔记
1. 参考内容:
(1) 鱼C工作室C++视频教程
(2) CSDN博主abc5382334的博客,链接:http://m.blog.csdn.net/article/details?id=18052757
(3) “walker的流水账”的CTO博客,来源:http://walkerqt.blog.51cto.com/1310630/968006
2. 笔记
/*
this指针
*/
/*
类的继承
基类(父类),子类
如果基类和子类都有构造器,则基类的构造器会先被调用。
*/
class Animal{ //定义一个基类
public:
std::string name;
Animal(std::string theName);
}
class Pig:public Animal{ //定义一个子类,Pig类是从Animal继承而来的
public:
Pig(std::string theName);
}
Animal::Animal(std::string theName){
name = theName;
}
Pig::Pig(std::string theName):Animal(theName){ //子类的构造器继承与Animal父类的构造器
}
/*
访问控制
某个对象试图调用它无权访问的函数时,编译器会报错。
C++中的访问级别:
public:任何代码可访问
protected:这个类本身和它的子类可以访问
private:只有这个类本身可以访问
建议在编写类时从public可是,然后从protected开始,最后是private
class Pig:public Animal{...}是告诉编译器继承的方法和属性的访问级别不发生任何改变
即public仍可以被所有代码访问,protected只能由基类和子类访问,private只能由基类本身访问。
class Pig:protected Animal{...}是告诉编译器继承的方法和属性的public级别改为protected,其他访问级别不发生任何改变
即public和protected都变为protected,只能由基类和子类访问;private只能由基类本身访问。
class Pig:private Animal{...}是告诉编译器继承的方法和属性的访问级别全都变为private
即public、protected和private都只能由基类本身访问。
*/
/*
覆盖
子类可以覆盖基类的方法。
具体做法是在子类中重新定义方法。
*/
//父类
Class Animal{
public:
void eat();//父类中定义的方法
}
//子类
Class Pig:public Animal{
public:
void eat();//子类中再一次声明,覆盖基类的eat()方法
}
//基类中关于eat()方法的定义
void Animal::eat(){
std::cout << "我正在吃东西" << std::endl;
}
//子类中关于eat()方法
void Pig::eat(){
Animal::eat(); //用了一个技巧,先调用了父类的eat()方法,在这里的结果是会显示“我正在吃东西”
std::cout << "吃的东西是菜汤" << std::endl;
}
/*
重载
重载机制允许定义多个同名的方法(函数),只是它们的输入参数必须不同(因为这时编译器是依靠不同的输入参数来区分不同的方法)
重载可提高代码可读性
*/
/*
在堆中创建动态对象
new 分配内存
delete 删除内存
每一个new都要有一个delete,要不会造成内存泄漏
*/
/*
头文件
头文件一般提供必要的函数声明和类声明,用#include可以将头文件包含进来。
在include时可以用/加上包含文件的路径
*/
/*
命名空间
在用户定义的范围内变量名称不重复即可。
命名空间的创建方法是
namespace myNamespace
{
//。。。
} //注意,这里没有分号
访问命名空间的三种方法:
1. 使用作用域:std::cout << "happy";
2. 使用using命令: using namespace std; 不建议用这种方法
3. 使用using把需要的特定命名从命名空间提取到全局作用域:using std::cout; cout << "happy";using指令出现的位置决定着从命名空间里提取出来的东西能用在哪个作用域内使用。
*/
/*
参考内容来源:CSDN博主abc5382334的博客,链接:http://m.blog.csdn.net/article/details?id=18052757
#ifndef ***
#define ***
#endif
如果没有定义***,则定义***;如果定义过了,就结束(endif)。
这样可以避免一个文件被包含(include)多次。
有些头文件重复引用只是增加了编译工作的工作量,使得效率低一些。但有些头文件被重复包含会引起错误。
*/
/*
参考内容来源:http://walkerqt.blog.51cto.com/1310630/968006
Q_OBJECT什么时候必须使用?
1. 对于定义了信号和槽的类,在类定义开始处必须有Q_OBJECT宏(《C++ GUI Qt4编程(第二版)》 p11)。
2. 对于定义属性的类,Q_OBJECT宏是必须的。(《C++ GUI Qt4 编程(第二版)p83》)。
*/