选择题
内联函数对于编译器只是一个建议,如果该函数没有递归、循环、并且代码较少,那么编译器就会采取内联,否则就不会采取内联的建议
所以选择:C
- 缺省参数只能从右向左依次给,例如
void func(int a,int b= 10,int c = 10
,所以如果某一个参数是缺省的,它后面的参数一定都是缺省的- 缺省参数可有可无
- 全缺省:全部缺省;半缺省:部分缺省
- 调用函数的时候, 传参是从左向右传递参数,与给缺省参数的顺序相反
回顾:类的两种定义方式
- 声明和成员函数的定义都放在类里面
- 类中放成员变量和成员函数的声明,类外部(可以放在其他.cpp中)进行成员函数的定义(
返回类型 类名::成员函数(参数列表)
)
所以答案选A,类中包括数据成员和函数成员的声明
B: 默认权限是私有
C: 共有、私有、保护哦都可以
D: 可以在类外,也可以在类里定义
初始化列表是成员真正初始化的地方,初始化列表中,只能对类中非静态的成员变量进行初始化,因为静态的成员变量是不依赖于对象,只是依赖于类的!
静态成员在类外部进行初始化
三种必须在初始化列表进行初始化的成员
- 没有默认构造函数的自定义类型的成员
- 引用成员
- const成员
所以,题目中只有bc符合,选B
A: 3+3是内置类型相加
B: b1+3 其实是调用b1.opertor+(&b1,3)
,这里因为该类具有单参数的构造函数,所以实参3在传递给operator+()
的形参的时候,会发生:
- 用3构造一个临时对象
- 临时对象拷贝构造出形参
所以b1+3是可以完成调用的!
C: b1+b2 调用
b1.operator(&b1,b2)
D: 3+d1,重载的operator+()
的第一个参数隐藏默认的是this,所以+号之前一定是一个BigNumber的对象。第一个参数是int类型,没有对应的函数重载,所以会报错!
友元函数不是类的成员函数,但是在友元函数中可以访问类中私有成员
成员函数具有隐含的this,受访问限定符的限制
A: A的说法不是很清楚,我的理解是:友元函数可以访问本类的所有对象。并且如果一个类是另一个类的友元类,那么这个友元类可以随意访问另一个类的内部成员,因为友元类中的所有成员函数都是另一个类的友元函数
B: 声明为友元,我是你的朋友自然可以访问你的私有成员变量或成员函数
C: 类的成员函数有this指针,没问题,但是选项说的有一些问题,应该是非静态的成员函数才具有this指针,静态成员函数可以直接通过类名+域作用限定符来访问
D: 友元函数不是成员函数!没有this指针
编程题
1. 合法括号序列判断
判断括号序列是否合法,显然要用到后进先出的栈
- 遇到左括号,入栈
- 遇到右括号,如果此时栈为空,说明没有左括号与之匹配,如果不为空,左右括号匹配,弹出左括号
- 如果遇到的既不是左括号也不是右括号,说明不合法(题目说了序列只能由括号组成)
- 那么最后如果栈为空,说明所有括号都匹配,如果栈不为空,说明有多余的左括号没有匹配到右括号返回false
代码
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
stack<char> st;
//遍历字符串A
for(size_t i = 0;i< n;++i)
{
//如果不是括号,返回false
if(A[i]!='(' && A[i]!=')')
{
return false;
}
//如果是左括号,入栈
if(A[i] == '(')
{
st.push(A[i]);
}
//如果是右括号,出栈(这里要注意检查是否为空,空就不出栈)
else if(A[i]==')')
{
//如果栈为空,说明没有匹配的左括号
if(st.empty())
{
return false;
}
else//栈不为空,配对弹出
{
st.pop();
}
}
}
//返回栈是否为空即可
return st.empty();
}
};
2. Fibonacci数列
题目让我们求出输入一个N,需要多少步才可以变成一个Fibonacci数
思路很简单
- 根据所给的N,求出N前面和N后面的那两个Fibonacci数left和right
- 取max(left,right)即可
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N;
cin >> N;
int f1 = 0;
int f2 = 1;
int ans =0;
//N超过ans的时候跳出循环
while(N > ans)
{
ans = f1 + f2;
f1=f2;
f2=ans;
}
//跳出的时候 N >= ans
// f1 N ans
// f1就是N前面那个Fibonacci数,ans是N后面那个
cout << min(ans-N,N-f1) << endl;
return 0;
}