1.构造函数生成的顺序
建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这3种构造函数的调用顺序为:
A.abc
B.acb
C.cab
D.cba
答案是A,b的意思应该是父类在子类中还有一个对象作为子类的成员
然后就是这样的构造函数的顺序
2.运算符重载
如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是:
A.一元运算符
B.二元运算符
C.选项A)和选项B)都可能
D.重载错误
答案是D,友元函数重载时,参数列表为1,说明是1元,为2说明是2元
成员函数重载时,参数列表为空,是一元,参数列表是1,为2元
3.为什么不使用#define而使用const和inline
一.#define是预处理,比如#define AS 1.653 ,可能AS不会进入记号表,如果出错,可能出现的错误提示是1.653而不是AS
二.define不会做类型检查(容易出错),const拥有类型,会执行相应的类型检查
define仅仅是宏替换,不占用内存,而const会占用内存
const内存效率更高,编译器可能将const变量保存在符号表中,而不会分配存储空间,这使得它成
为一个编译期间的常量,没有存储和读取的操作
当使用#define定义一个简单的函数时,强烈建议使用内联函数替换!
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是
通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时
候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开
销。
4.explicit:阻止执行隐式类型转换(以下借用百度百科)
explicit构造函数是用来防止隐式转换的。请看下面的代码:
class Test1
{
public:
Test1(int n)
{
num=n;
}//普通构造函数
private:
int num;
};
class Test2
{
public:
explicit Test2(int n)
{
num=n;
}//explicit(显式)构造函数
private:
int num;
};
int main()
{
Test1 t1=12;//隐式调用其构造函数,成功
Test2 t2=12;//编译错误,不能隐式调用其构造函数
Test2 t2(12);//显式调用成功
return 0;
}
Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数。
而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码24行会出现编译错误。
普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。
5.拷贝构造函数的使用:(只有一个参数,而且要为引用,不然会造成无限的复制构造)
class Widget{
public:
Widget(); //default构造函数
Widget(const Widget& rhs); //拷贝构造函数
Widget& operator=(const Widget& rhs);//拷贝赋值符
};
Widget w1; //调用default构造函数
Widget w2(w1); //调用拷贝构造函数
w1=w2; //调用拷贝赋值符
Widget w3=w2; //调用拷贝构造函数
6.类型转换:
公有派生类对象可以被当作基类的对象使用,反之则不可.
一.派生类的对象可以隐含转换为基类对象;
二.派生类的对象可以初始化基本的引用
三.派生类的指针可以隐含转换为基类的指针.
通过基类对象名,指针只能使用从基类继承的成员
7.#include <iostream>
using namespace std;
class A
{
public:
int m;
int* p;
};
int main()
{
A s;
s.m = 10;
cout << s.m << endl; //10
s.p = &s.m;
*s.p = 5;//!!!
cout << s.m << endl; //5
return 0;
}
8.若函数参数为引用,则函数将不再为传入的实参建立拷贝,
结果直接作用在实参上,是c++提供的一种跨函数传值的手段。
这里同时加了const防止更改实参,
则只是省去了函数建立拷贝的步骤,应该是为了提升运行效率,去掉&不会影响程序结构。
9.std::string str,str可以被修改,而且会调用拷贝构造函数。
std::sring& str,str可以被修改,但不会调用拷贝构造函数。
const::string str ,str不能被修改,但会调用拷贝构造函数。
const::string& str,str不能被修改,而且也不会调用拷贝构造函数。
10.深拷贝与浅拷贝
简单的来说就是,在有指针的情况下,浅拷贝只是增
加了一个指针指向已经存在的内存,而深拷贝就是增
加一个指针并且申请一个新的内存,使这个增加的指
针指向这个新的内存.
采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
11.this指针隐含于每一个非静态成员函数中
每个对象调用函数时,会先把对象的地址传给this指针,然后通过this指针来调用
12.
1、在类的定义中进行的,只有const 且 static 且 integral 的变量。
2、在类的构造函数初始化列表中, 包括const对象和Reference对象。
3、在类的定义之外初始化的,包括static变量。因为它是属于类的唯一变量。
4、普通的变量可以在构造函数的内部,通过赋值方式进行。当然这样效率不高。
13.static:
1.当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。
静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化
)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它
。所以,普通全局变量穿上static外衣后,它就变成了新娘,已心有所属,
只能被定义它的源文件(新郎)中的变量或函数访问。
14.
重载为成员函数:
前置单目运算符,重载函数没有形参
后置++运算符,重载函数需要有一个int形参
//前置单目运算符重载
Clock& operator ++ ();
//后置单目运算符重载
Clock operator ++ (int);
15.虚函数不能为内联函数,而且并且是非静态的函数,因为静态的是属于类的,
不是属于对象的,而虚函数就是要被对象操作,在类里声明,类外定义,因为虚函
数是要动态绑定,就是要在运行时候处理,而内联函数是在编译时候就处理
构造函数不能是虚函数
析构函数可以是虚函数
虚函数一般不声明为内联函数,因为对虚函数的调用需要动态绑定,而对内联函
数的处理是静态的
如果派生类和基类函数都一样,那么派生类就算不加virtual也会被视为虚函数
16.为什么需要虚析构函数:
假设基类对象指针指向派生类成员对象,
那么如果不把基类和派生类的析构函数加virtual
那么就会只析构基类的所分配的空间,不会析构派生类的所分配的空间
17.cout << sizeof("\x0012") << endl;
cout << sizeof("hello") << endl;
输出 2和6
cout << sizeof("\48") << endl; 3 "'\"后面是跟8进制,但是有个8,超过了8,所以"\4"是一个字符,8是一个字符
cout << sizeof("\048") << endl; 3
cout << sizeof("\048\48") << endl; 5
cout<<sizeof("??=")<<endl; 旧版本编译器为2,新版本为4,因为历史原因,以前??=相当于#号
18.归并排序时间复杂度的递推公式T(n)=2T(n2)+O(n)的解是什么?其中O(n)项代表什么?
nlogn,归并两个已排序子向量的时间
19. 重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
20.论:
1. 构造函数不能为 virtual, 构造函数不能继承;
2. 如果子类不显式调用父类的构造函数,编译器会自动调用父类
C++笔记.zip_C++_笔记
版权申诉
65 浏览量
2022-07-13
21:25:59
上传
评论
收藏 15KB ZIP 举报
林当时
- 粉丝: 95
- 资源: 1万+
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0