1:知识点1:类的定义方法:struct和class两种方法的用法和区别。
知识点2:类内成员的初始化方法:成员初始化列表。编译器会调用构造函数初始化成员,可以被重载。
首先举个例子方便于理解:
#include <iostream>#include<string>#include<vector>using namespace std;/*C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct 只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。C++中的 struct 和 class 基本是通用的,唯有几个细节不同:1:使用 class 时,类中的成员默认都是 PRivate 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。(最本质的区别)2:class 继承默认是 private 继承,而 struct 继承默认是 public 继承(《C++继承与派生》一章会讲解继承)。3:class 可以使用模板,而 struct 不能。*///利用class定义类class Student{ Student(string name, int age, int score);//构造函数 string m_name; int m_age; int m_score;//定义三个变量 void showname()//定义一个函数 { cout<<m_name<<"的年龄是:"<<m_age<<",得分为:"<<m_score<<endl; }//类内定义的函数,编译器会优先视为内联函数public:private:protected://三种形式};Student::Student(string name, int age, int score):m_name(name), m_age(age), m_score(score){ }//成员初始化列表,将name赋给m_name,改变类内变量//利用strcut定义类struct Students{ Students(string name, int age, int score);//构造函数 string m_name; int m_age; int m_score;//定义三个变量,默认public void shownames()//定义一个函数 { cout<<m_name<<"的年龄是:"<<m_age<<",得分为:"<<m_score<<endl; }//类内类外定义皆是在同文件中,也可定义在.h文件中。};Students::Students(string name, int age, int score):m_name(name), m_age(age), m_score(score){ }//列表初始化,覆盖类的内部变量/*总结1:struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的2:当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。 3:然而对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,也让你的代码更具可读性。 */int main(int argc, char** argv){ Student stu1("小明", 18, 3);//报错:虽然已声明,但是不可访问。成员没有限定public,默认都是private,外部不可访问。 Students stu2("小明", 18, 3);//正常 stu2.shownames(); return 0;}此题的答案:
#include <iostream>#include<string>#include<vector>using namespace std;struct Sales_data { Sales_data(); string bookNo; unsigned units_sold ; double revenue ;//类内部的变量成员不允许在定义时初始化,必须使用构造函数};Sales_data::Sales_data(){ units_sold = 0; revenue = 0.0;}int main(int argc, char **argv){ Sales_data total;//此部分和第一章21页的内容相同 if (cin >> total.bookNo >> total.units_sold >> total.revenue) { Sales_data trans; while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) { if (total.bookNo == trans.bookNo) { total.units_sold += trans.units_sold; total.revenue += trans.revenue;//第三题的使用修改之处 } else { cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl; total = trans; } } cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl; } else { std::cerr << "No data?!" << std::endl; return -1; } return 0;}2:知识点1:在.h文件中声明类较好知识点2:this指的是“这个”对象,是一个常量指针
知识点3:紧跟在参数列表之后的const表示this是一个常量指针——关于const成员函数,表明常量成员函数不能改变调用它对象的内存,也就是表示该函数只可访问,不可修改。
本小节已经介绍了combine和isbn的相关信息,直接加入该类即可。
3:将第一题中的+=操作改为使用combine函数即可。
4 . 5:使用class来实现这个类
#include <iostream>#include<string>#include<vector>using namespace std;class Person{public://声明为public Person(string Client_name, string Client_address);//构造函数 Person();//构造函数的重载 string name; string address;//内部变量 void Show_info() { cout<<name<<"'s"<<" address is "<<address<<endl; }//类内定义函数 string& const getname() { return name; } string& const getaddress() { return address; }//返回姓名地址的函数,只可访问,不可修改};Person::Person(string Client_name, string Client_address):name(Client_name),address(Client_address){};//构造函数定义内部变量//此处我们在一个文件内定义了该类,如若类较大,应置于.h文件中int main(int argc, char **argv){ Person Client1("Mr.right","your heart");//实例化 Client1.Show_info();//调用其中的显示信息函数 return 0;}最好是const,这样就可以保证该函数只能访问内部变量而不能写内部变量。
6 . 7:知识点1:与类相关的函数虽然可以定义声明分开,但是需要将其与类放在同一个文件中,这样在使用接口时只需要引入一个文件即可。
加入书中的三个函数即可
替换掉原来的三种操作皆可
8:知识点:普通引用和常量引用的区别在于你是否想改变它~
9:知识点:撰写头文件时,无论是否被包含在其他任何头文件中,都应设置保护符,防止重复包含
撰写头文件时应加上以下代码:
#ifndef Cccc//第一次包含本头文件时,#ifndef判断为真,预处理器将处理后面的内容直到#endif,此时的预处理变量Cccc已定义#define Cccc//第二次包含本头文件时,#ifndef判断为假,预处理器将忽略后面的内容,预处理变量一般定义为本头文件的大写形式/*....*/#endif//只要简单的加上就好了,无视C++中的作用域规则稍加修改即可:
istream& read(istream& is, Person& person){ is >> person.name >> person.address; if (!is) person = Person(); return is;//返回输入流}//接受一个IO类型的引用作为其参数,IO类属于不能被拷贝的类型,只能用引用来传递它们ostream& print(ostream& os, const Person& person){ os << person.name << " " << person.address; return os;}10:很明显由外向内的分析,条件语句的作用是同时判断两次读操作的对象。
新闻热点
疑难解答
图片精选