C++ 学习笔记-1

由于C++的相关知识在工作的过程中有些遗忘,所以重新拿起了book温习一下,写下该笔记忘日后可以快速浏览学习,部分随笔代码不是在这台电脑上所以没有贴出。(C++primer 第四版)

12.C++ 中的类

12.1 类的定义和声明
1.C++中用类来定义自己的数据类型。
定义和声明

class Sales_item {
public:
	double avg_prce() const;
	bool same_isbn(const Sales_item &rhs) const
	{
		return rhs.isbn == isbn;
	};
Sales_item() :units_sold(0), revenue(0.0) {}
private:
	std::string isbn;
	unsigned units_sold;
	double revenue;
};

Ps:类也可以使用struct 来声明, 个人觉得class就是一个特殊的结构体
数据 -> 成员数据, 函数指针就偶是成员函数。

1.类的成员: 数据、函数或类型别名。
Public:外部可以访问的数据和函数。
Private:类内部成员可以使用的数据和函数。
Protect:在该类的子类中可以访问的数据和函数
2.构造函数
简单的说就是初始化该类的数据成员。

3.构造函数
3.1在类内部定义的函数默认为内联函数。 在外部定义的函数必须指明累的作用域
3.2成员函数有一个附加的隐含实参, 就是条用者自己可以使用自己的成员数据
3.3Const 成员函数不能改变其所操作的对象的数据成员。
double avg_prce() const;
即不能改变操作对象的数据。

习题:

class person {
public:
	person(std::string name, std::string adress): name (name), adress(adress){};
	std::string get_name() const {
		return name;
	};
	std::string get_adress() const {
		return adress;
	};

private:
	std::string name;
	std::string adress;
};

4.数据的抽象和封装
封装:
是一项讲低层次的元素组合起来形成新的高层次实体的技术。
换句话说就是把函数和数据封装了一下,作为一个集合。 这个集合可以提供给我们一些功能,并且他有自己的处理逻辑。

数据的抽象:
是一种依赖于接口和实现分离的编程技术。
换句话说就是把一个类当做一个真正的对象,比如说一个人。或者工程中的一个工具。

4.1class 与 struct的区别
Class:在第一个访问标号之前,成员是私有的。
Struct:在第一个访问标号之前,成员是共有的。
(ps: 访问标号的出现次数是没有限制的)

5.2【面试】封装的定义好处

封装是一种将低层次的元素组合起来形成新的、高层次实体的技术。 例如,函数是封装的一种形式:函数所执行的细节行为被封装在函数本身在个大实体中。类:代表了若干成员的聚集,大多数类隐藏了实现该类型的成员。
好处: 避免类内部出现无意的、可能破坏对象状态的用户级状态的用户级错误; 使得在修改类的实现的时候只要保持类的接口不变,就无需改变用户级别的代码。

6.类定义的内容
6.1多个数据成员
6.2 在类的内部定义别名,只有该命名空间才可以访问的别名,
eg:public:
typedef std::string::size_type index;
6.3 函数的重载:重载函数的形参数量和数量不能完全相同。
6.4 指定inline函数 a.在class的定义中直接实现该函数。 b.在声明或者定义处均可定义inline函数。
eg:
Public:
inline char get() const;
习题:

#pragma once
#include <stdio.h>
#include <string>

class Screen
{
public:
	typedef std::string::size_type index;
	Screen(index heigh, index weight, std::string &contents): mheigh(heigh), mweight(weight), mcontents(contents){
		contents = "I am China.";
		mcontents = contents;
	};

	std::string GetContents() const;
	~Screen() {	
	};

private:
	index mheigh, mweight;
	std::string mcontents;
};

Ps:此处为了说明引用就是一个对象的别名,相当于取地址。好处就是我们在写代码的时候不需要判断是不是空指针。

void main() {
	std::string text = "hello world!";
	std::cout << "old:" << text << std::endl;

	Screen PhoneScreen = Screen(10,10, text);
	std::cout << "get:" << PhoneScreen.GetContents() << std::endl;
	std::cout << "new:" << text << std::endl;
	return;
}

7.关于前向声明
7.1 有时为了使用一个对象,我们需要前项声明一个类,但是不具体声明定义这个类。这样我们可以再该类的定义之前就声明该类型的变量。
a.如果前项声明,只能使用该声明的指针,原因很简单:编译器还没有给该对象分配内初,只有地址的大小是固定的。
b.前项声名的对象为不全全类型。

12.2 关于类中this用法
1.用法
1.当我们作为一个整体引用该对象时,而不是用其成员。
2.函数返回类型是Screen& 表明返回自身。
3.const 函数只能返回*this作为一个const引用,就是不能对返回值进行修改。可以保护数据。
4.可以基于const来重载函数

Tip:公用代码作为私有函数->有助于日后的修改

12.3 类的作用域

  1. 在类的定义之外必须用完全限定名(Sales_item::avg_price),在函数的定义中,形参表和函数体都出现成员名之后,所以是在函数作用域中的。相反函数的返回值在这个作用域之外,如果使用类中typedef的类型和该类的引用,需要使用完全限定名。

2.关于类作用域中变量查找的理解:
·首先在类的成员函数局部作用域中查找声明。
·如果找不到则会在所有类成员中查找声明。
·如果在类中找不到声明,则在此类定义之前的作用域中查找。

思考:不管是C还是C++,变量的查找总是由小到大的一个扩展的范围,局部变量的优先级高,它会屏蔽外部的同名变量,但是在工作的过程中,最好不要使用同名的变量,否则很容易自己就混淆了,同时也要注意,局部变量的生命周期。

12.3 类的构造函数

  1. 类的构造函数,可以理解为C中经常要写的init函数,你要使用该类的对象,就要初始化。初始化的工作想当然的就交给了构造函数来做—— 保证每个对象都有合适的初始值。
  2. 构造函数的初始化列表:
    Sales_item(): units_sold(0), revenue(0){
    //other operation in init
    }

思考:构造函数初始化列表中初始化和在构造函数的定义中进行初始化有什么不同呢?
构造函数首先会运行初始化列表,之后再运行函数体。其次在你运行构造函数的函数体的时候,编译器已经给相应的变量赋值了,所以再次赋值则会产生不必要的计算。或者可以理解为,在执行函数体的时候相应的变量需要有相应的值,你不赋值编译器会赋值。
正是因为这个原因,const成员和引用类型,必须在个时候初始化。原因也很简单,const 的变量的值不能修改但是要初始化,引用就是一个别名,不能修改也需要初始化。 注意,,,根据声明的循序来初始化。所以在写的时候一定要注意这个循序。

3.构造函数可以被重载,只要参数不同就可以。
4.只要创建一个类型的对象,编译器就会运行一个合适的构造函数(包括默认构造函数)。原因很简单就比方你创建一个int型的对象,编译器一般会初始化一个32位的内存来给你用一样,编译器也需要分配给这个对象相应的内存,同时还要进行初始化。

习题:
12.21

#pragma once
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;

class A {
public:
	A(string name);
private:
	const string ClassName;
	int ClassID;
	double* pd;
	ifstream& ClassStream;
};

#include<fstream>
ifstream file("text1");
A::A(std::string name):ClassName(name), ClassID(0), pd(NULL), ClassStream(file){

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值