CPPprimer第三-七章
CPPprimer第三-七章
Hoshea Zhang字符串、向量和数组
using
有了using声明就不需要专门前缀去使用所需的名字了:
1
2
3
4
5
6
7
8
9
using std::cin;
int main(){
int i;
cin>>i;
std::cout<<i;
return 0;
}位于头文件的代码,一般来说不应该使用using声明,因为头文件的内容会拷贝到所有引用他的文件中去,如果头文件里有某个using的声明,那么每个使用该头文件都会有这个声明。
string
有时我们需要能在得到的字符串中保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。
1
2
3
4
5
6
7int main(){
string line;
while(getline(cin,line)){
cout<<line;
}
return 0;
}当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符+两侧的运算对象至少有一个string(字面值不是string)
表达式
显式转换
static_cast
任何明确定义的类型转换,只要不包含底层const,都可以用static_cast:
double slope = static_cast<double>(j)/i;
dynamic_cast
我们在后面再讲
const_cast
去掉const属性:
1
2const char *pc;
char *p = const_cast<char*>(pc);reinterpret_cast
非常危险,避免使用
语句
switch
尽管switch语句不是非得在最后一个标签后面写上break,但是为了安全起见最好这么做。
函数
内联函数和constexpr函数
内联函数可避免函数调用的开销
constexpr函数指能用于常量表达式的函数
1
2
3
4constexpr int new_sz(){
return 42;
}
constexpr int foo = new_sz();需要注意的是,函数的返回类型,所有形参类型都必须是字面值类型
inline和constexpr函数一般定义在头文件中
函数指针
普通函数:
bool compare(const string &,const string &);
函数指针:
把compare改成(*pf)即可
pf两边括号必不可少,否则则代表返回值为bool* 指针的函数
类
- 一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件中
访问控制和封装
定义在public说明符之后的成员,在整个程序内可被访问,public成员定义类的接口
定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private相当于就是部分封装了类的实现细节
class和struct:
唯一的区别就是默认访问权限不同,struct关键字默认是public,class默认是private
友元
既然Sales_data的数据成员是private的,我们的接口read、print和add函数也就无法正常编译了,这是因为尽管这几个函数是类的接口的一部分,但他们不是类的组成成员,所以我们需要增加一条friend关键字开始的函数声明语句
friend std::ostream &print(std::ostream&,const Sales_data&);
然后后面重新声明这个函数:
std::ostream &print(std::ostream&,const Sales_data&);
其他特性
即使两个类的成员列表完全一样,他们也是两个类型
为了完成任务,clear需要访问Screen的私有成员,要让这个访问合法,要让Screen把window_mgr指定成它的友元:
1
2
3class Screen{
friend class Window_mgr;
}
静态成员
- 类的静态成员存在于任何对象之外,对象中不包括任何与静态数据成员有关的数据,static成员被所有类的对象共享。
- 虽然静态成员不属于类的某个对象,但是我们仍然能够使用类的对象、引用以及指针来访问静态成员,成员函数不需要作用域运算符就能使用静态成员
到这里第一部分就看完了,都是很基础的东西,我只记录了一些记忆不深的点