《C++ Primer Plus》第十二章复习题和编程练习

news/2024/7/25 2:03:39/文章来源:https://blog.csdn.net/weixin_70742989/article/details/139232264

目录

  • 一、复习题
  • 二、编程练习

一、复习题

1. 假设String类有如下私有成员:

// String 类声明
class String
{
private: char* str;int len;// ...
};

a. 下述默认构造函数有什么问题?

String::String() { }  // 默认构造函数

b. 下述构造函数有什么问题?

String::String(const char* s)  // 构造函数
{str = s;len = strlen;
}

c. 下述构造函数有什么问题?

String::String(const char* s)  // 构造函数
{strcpy(str, s);len = strlen(s);
}

答:注意:下面的代码需要包含相应的头文件和using声明。
a. 该默认函数并未进行任何操作,则成员变量str与len的值是未知的(和创建局部变量未初始化一个道理)。而String类涉及动态内存分配,所以需要给str适当初始化(一般初始化为空指针——nullptr)。
修改如下:

String::String()  // 默认构造函数
{str = nullptr;len = 0
}

b. 该构造函数中语句str = s; 只是单纯地让str和s指向同一个字符串,str只是存储了s指向的字符串的首地址,这是浅拷贝。而我们需要拷贝存储字符串的副本(深拷贝)。
修改如下:

String::String(const char* s)
{len = strlen(s);  // 存储字符串的长度,不包括空字符str = new char[len + 1];  // 申请空间,别忘了空字符'\0'strcpy(str, s);  // 拷贝字符串内容副本
}

c. 还未在堆上申请空间,str指向的地方是未知的,直接使用函数strcpy()进行内容拷贝会导致不确定的问题。
修改如下:

String::String(const char* s)
{len = strlen(s);  // 存储字符串的长度,不包括空字符str = new char[len + 1];  // 申请空间,别忘了空字符'\0'strcpy(str, s);  // 拷贝字符串内容副本
}

2. 如果你定义了一个类,其指针成员是使用new初始化的,请指出可能出现的三个问题及如何纠正这些问题?

答:
1)问题:没有定义对应的析构函数,和使用对应的delete运算符的形式。
纠正:使用new为成员指针分配空间需要对应的析构函数来释放空间,使用什么形式申请空间就需要使用什么形式释放空间,如:int * pi = new int; —— delete pi; ,int* pa = new int[5];——delete[5]pa;。而且所有构造函数只能使用上面相同的一种new形式,使之与析构函数中的delete形式对应。
2)问题:没有定义相关的复制构造函数。
纠正:如果没有定义赋值构造函数,编译器会提供默认的复制构造函数,其只能进行浅拷贝,只能复制需要拷贝的内容的地址。需要定义相关的复制构造函数进行深拷贝,为拷贝内容申请空间。
3)问题:没有重载对应的赋值运算符
纠正:和问题2一样,如果没有重载赋值运算符,编译器也会提供默认的,同样是浅拷贝。我们需要定义相关的赋值运算符,来进行深度拷贝。需要先释放前面存储的动态空间,然后根据拷贝大小申请新的空间。

3. 如果没有显示提供类方法,编译器将自动生成哪些类方法?请描述这些隐式生成的函数的行为。

答:
1)若没有提供构造函数,则编译器会提供一个默认构造函数,该函数什么都不做,但允许声明数组和未初始化的对象。
2)若没有提供析构函数,则编译器会提供一个默认析构函数,该函数什么都不做。
3)若没有提供拷贝构造函数,则编译器会提供一个默认的拷贝构造函数,该函数进行浅拷贝。
4)若没有提供赋值运算符重载,则编译器会提供默认的赋值运算符重载,该函数也进行浅拷贝。
5)若没有提供地址运算符重载,则编译器会提供默认的地址运算符重载,该函数返回调用对象的地址,也就是this指针的值。

4. 找出并改正下述类声明中的错误。

// nifty 类声明
class nifty
{// 数据char personality[];int talents;// 方法nifty();nifty(char* s);ostream& operator<<(ostream& os, nifty& n);
};nifty::nifty()
{personality = NULL;talents = 0;
}nifty::nifty(char* s)
{personality = new char[strlen(s)];personality = s;talents = 0;
}ostream& nifty::operator<<(ostream& os, nifty& n)
{os << n;
}

答:首先,类声明中一般成员变量为私有成员(private),而成员函数为公有成员(public)。不显式声明时,类(class)默认为private,而结构(struct)默认为public。所以需要将成员函数声明为public。在默认构造函数中,personality是数组名也是指向第一个元素的char指针,但是其指向不能改变,可以使用strcpy()函数将其初始化为空字符串,参数s最好声明为const。在第二个提供一个参数的构造函数中,也是同样的问题。最后一个重载运算符(<<)函数需要被声明为友元函数,且该函数定义完全就是狗屁,我们都还没定义,你就用上了成品。根据上述问题,我们通过把变量personality修改为char指针,然后添加析构函数进行重写代码。(当然拷贝构造函数和赋值运算符重载也是需要的,读者可以自行编写)

下面是正确的代码:

// nifty 类声明
class nifty
{
private:// 数据char* personality;int talents;
public:// 方法nifty();nifty(const char* s);~nifty();friend ostream& operator<<(ostream& os, const nifty& n);
};// 类方法定义
nifty::nifty()  // 默认构造函数
{personality = nullptr;talents = 0;
}nifty::nifty(const char* s)  // 构造函数
{int len = strlen(s);personality = new char[len+1];strcpy(personality, s);talents = 0;
}nifty::~nifty()  // 析构函数
{if (personality != nullptr)delete[]personality;
}ostream& operator<<(ostream& os, const nifty& n)  // 运算符(<<)重载
{os << "Personality: " << personality << endl;os << "Talents: " << talents << endl;return os;
}

5. 对于下面的类声明,回答下面的问题。

// Golfer 类声明
class Golfer
{
private:char* fullname;  // 指向包含高尔夫的名称的字符串int games;  // 保存玩的高尔夫游戏的个数int* scores;  // 指向高尔夫分数数组的第一个元素
public:Golfer();Golfer(const char* name, int g = 0);Golfer(const Golfer& g);~Golfer();
};

a. 下列各条语句将调用哪些类方法?
1 Golfer nancy;
2 Golfer lulu(“Little Lulu”);
3 Golfer roy(“Roy Hobbs”, 12);
4 Golfer *par = new Golfer;
5 Golfer next = lulu;
6 Golfer hazzard = “Weed Thwacker”;
7 *par = nancy;
8 nancy = “Nancy Putter”;
b. 很明显,类需要有另外几个方法才能更有用,但是类需要哪些方法才能防止数据被损坏呢?

答:
a.

  1. 调用默认构造函数。
  2. 调用一个参数的构造函数。
  3. 调用两个参数的构造函数。
  4. 调用默认构造函数。
  5. 调用编译器提供的默认的复制构造函数。
  6. 先调用一个参数的构造函数创建临时对象,然后调用编译器提供的默认复制构造函数。
  7. 调用编译器提供的默认的赋值运算符重载函数。
  8. 先调用一个参数的构造函数创建临时对象,然后调用编译器提供的默认的赋值运算符重载函数。

b. 由于编译器提供的默认的复制构造函数和赋值运算符重载函数都是浅拷贝,所以需要用户自己定义复制构造函数和赋值运算符重载函数来对对象实行深度拷贝,避免程序出现问题。

二、编程练习

1. 对于下面的类声明,为这个类提供实现,并编写一个使用所有成员函数的小程序。

// Cow 类声明
class Cow
{
private:char name[20];char* hobby;double weight;
public:Cow();  // 默认构造函数Cow(const char* nm, const char* ho, double wt);Cow(const Cow& c);  // 复制构造函数~Cow();  // 析构函数Cow& operator=(const Cow& c);  // 赋值运算符重载void ShowCow() const;  // 显示所有有关于奶牛的数据
};

答:三个文件。

Cow.h头文件

#pragma once// 头文件
#include <iostream>// Cow 类声明
class Cow
{
private:char name[20];char* hobby;double weight;
public:Cow();  // 默认构造函数Cow(const char* nm, const char* ho, double wt);Cow(const Cow& c);  // 复制构造函数~Cow();  // 析构函数Cow& operator=(const Cow& c);  // 赋值运算符重载void ShowCow() const;  // 显示所有有关于奶牛的数据
};

main.cpp测试文件

// 头文件
#include "Cow.h"// using 声明
using std::cout;
using std::endl;int main()
{// 默认构造函数Cow cow1;cow1.ShowCow();cout << endl;// 三个参数的构造函数Cow cow2("若雪", "干饭", 888.8);cow2.ShowCow();cout << endl;// 复制构造函数Cow cow3(cow2);cow3.ShowCow();cout << endl;// 赋值运算符cow3 = cow1;cow3.ShowCow();cout << endl;return 0;
}

Cow.cpp方法定义文件

// 头文件
#include "Cow.h"
#include <cstring>// using 声明
using std::cout;
using std::endl;Cow::Cow()  // 默认构造函数
{strcpy(name, "小雪");// 申请空间hobby = new char[strlen("吃草") + 1];strcpy(hobby, "吃草");weight = 888.0;
}Cow::Cow(const char* nm, const char* ho, double wt)
{strcpy(name, nm);// 申请空间hobby = new char[strlen(ho) + 1];strcpy(hobby, ho);weight = wt;
}Cow::Cow(const Cow& c)  // 复制构造函数
{strcpy(name, c.name);// 申请空间hobby = new char[strlen(c.hobby) + 1];strcpy(hobby, c.hobby);weight = c.weight;
}Cow::~Cow()  // 析构函数
{// 释放空间delete[]hobby;  // 与申请的格式对应
}Cow& Cow::operator=(const Cow& c)  // 赋值运算符重载
{if (this == &c)  // 检查是否给自己赋值{return *this;}else{strcpy(name, c.name);// 释放原来的空间delete[]hobby;// 申请新的空间hobby = new char[strlen(c.hobby) + 1];strcpy(hobby, c.hobby);weight = c.weight;return *this;}
}void Cow::ShowCow() const  // 显示所有有关于奶牛的数据
{cout << "Name: " << name << endl;cout << "Hobby: " << hobby << endl;cout << "Weight: " << weight << endl;
}

2. 通过完成下面的工作来改进String类的声明(即将String1.h升级为String2.h)。
a. 对+运算符进行重载,使之可以将两个字符串合并成一个。
b. 提供一个Stringlow()成员函数,将字符串中所有的字母字符转换为小写(注意cctype系列的字符函数)
c. 提供String()成员函数,将字符串中所有字母字符转换为大写。
d. 提供一个这样的成员函数,它接受一个char参数,返回该字符在字符串中出现的次数。使用下面的程序来测试你的工作。

// 头文件
#include "String2.h"// using 声明
using std::cin;
using std::cout;
using std::endl;int main()
{String s1(" and I am a C++ student.");String s2 = "Please enter your name: ";String s3;cout << s2;cin >> s3;s2 = "My name is " + s3;cout << s2 << endl;s2 = s2 + s1;s2.Stringupper();cout << "The string\n" << s2 << "\ncontains " << s2.ch_times('A')<< " 'A' characters in it.\n";s1 = "red";String rgb[3] = { String(s1), String("green"), String("blue") };cout << "Enter the name of a primary color for mixing light: ";String ans;bool success = false;while (cin >> ans){ans.Stringlow();for (int i = 0; i < 3; ++i){if (ans == rgb[i]){cout << "That's right!\n";success = true;break;}}if (success)break;elsecout << "Try again!\n";}cout << "Bye\n";return 0;
}

输出应于下面相似。
Please enter your name: Fretta Farbo
My name is Fretta Farbo.
The string
My NAME IS FRETTA FARBO AND I AM A C++ STUDENT.
contains 6 ‘A’ characters in it.
Enter the name of a primary color for misxing light: yellow
Try again!
BLUE
That’s right!
Bye

答:两个文件。

String2.h头文件

#pragma once// 头文件
#include <iostream>// String 类声明
class String
{
private:char* str;  int len;  // 字符串长度static int num_strings;  // 目前有多少个String对象static const int CINLIM = 80;  // 输入的限制
public:String();  // 默认构造函数String(const char* s);String(const String& s);  // 复制构造函数~String();  // 析构函数int lenth() const { return len; }  // 返回字符串长度int ch_times(char key) const;  // 返回字符key在字符串中出现的次数void Stringlow();void Stringupper();String& operator=(const char* s);String& operator=(const String& s);char& operator[](int i);const char& operator[](int i) const;String operator+(const String& s) const;// 关系运算符重载friend bool operator<(const String& s1, const String& s2);friend bool operator>(const String& s1, const String& s2);friend bool operator==(const String& s1, const String& s2);friend String operator+(const char* s, const String& str);friend std::ostream& operator<<(std::ostream& os, const String& s);friend std::istream& operator>>(std::istream& is, String& s);// 静态成员函数static int HowMany();
};

String2.cpp方法定义文件

// 头文件
#include "String2.h"
#include <cctype>
#include <cstring>// using 声明
using std::endl;// 静态成员变量初始化
int String::num_strings = 0;String::String()  // 默认构造函数
{str = nullptr;len = 0;++num_strings;
}String::String(const char* s)
{len = strlen(s);// 申请空间str = new char[len + 1];strcpy(str, s);++num_strings;
}String::String(const String& s)  // 复制构造函数
{len = s.len;// 申请空间str = new char[len + 1];strcpy(str, s.str);++num_strings;}String::~String()  // 析构函数
{// 释放空间if (str != nullptr)delete[]str;
}int String::ch_times(char key) const  // 返回字符key在字符串中出现的次数
{int times = 0;for (int i = 0; i < len; ++i){if (str[i] == key)++times;}return times;
}void String::Stringlow()
{for (int i = 0; i < len; ++i){str[i] = tolower(str[i]);}
}void String::Stringupper()
{for (int i = 0; i < len; ++i){str[i] = toupper(str[i]);}
}String& String::operator=(const char* s)
{len = strlen(s);// 释放之前的空间delete[]str;// 申请新的空间str = new char[len + 1];strcpy(str, s);return *this;
}String& String::operator=(const String& s)
{len = s.len;// 释放之前的空间delete[]str;// 申请新的空间str = new char[len + 1];strcpy(str, s.str);return *this;
}char& String::operator[](int i)
{return str[i];
}const char& String::operator[](int i) const
{return str[i];
}String String::operator+(const String& s) const
{int total = len + s.len;// 申请空间char* result = new char[total + 1];strcpy(result, str);strcat(result, s.str);String tmp(result);// 释放空间delete[]result;return tmp;
}String operator+(const char* s, const String& str)
{int total = strlen(s) + str.len;// 申请空间char* result = new char[total + 1];strcpy(result, s);strcat(result, str.str);String tmp(result);// 释放空间delete[]result;return tmp;
}// 关系运算符重载
bool operator<(const String& s1, const String& s2)
{return (strcmp(s1.str, s2.str) < 0);
}bool operator>(const String& s1, const String& s2)
{return s2 < s1;
}bool operator==(const String& s1, const String& s2)
{return !strcmp(s1.str, s2.str);
}std::ostream& operator<<(std::ostream& os, const String& s)
{if (s.str != nullptr){os << s.str;}return os;
}std::istream& operator>>(std::istream& is, String& s)
{char tmp[String::CINLIM];is.getline(tmp, String::CINLIM);if (!is){is.clear();while (is.get() != '\n')continue;return is;}s = tmp;return is;
}// 静态成员函数
int String::HowMany()
{return num_strings;
}

运行结果
在这里插入图片描述

3. 重写程序清单10.7和程序清单10.8描述的Stock类,使之使用动态分配的内存,而不是string类对象来存储股票名称。另外,使用重载的operator<<()定义代替show()成员函数。再使用程序清单10.9测试新的程序。

答:使用动态内存分配,可以使用char*指针,也可以使用指向string类的指针。在构造函数中申请空间,在析构函数中释放空间,申请和释放的形式需要匹配。

Stock.h头文件

#pragma once// 头文件
#include <iostream>// Stock 类声明
class Stock
{
private:char* company;  // 股票公司名称int shares;  // 股票数量double share_val;  // 每份股票double total_val;  // 总值void set_tot() { total_val = share_val * shares; }  // 设置总值
public:Stock();  // 默认构造函数Stock(const char* co, int n, double pr);~Stock();  // 析构函数void buy(int num, double pr);  // 买进void sell(int num, double pr);  // 卖出void update(double pr);  // 更新价格// 运算符(<<)重载friend std::ostream& operator<<(std::ostream& os, const Stock& s);const Stock& topval(const Stock& s) const;  // 返回总值大的对象
};

main3.cpp测试文件

// 头文件
#include "Stock.h"// using 声明
using std::cin;
using std::cout;
using std::endl;// 符号常量声明
const int STKS = 4;int main()
{Stock stocks[STKS] = {Stock("NanoSmart", 12, 20.0),Stock("Boffo Objects", 200, 2.0),Stock("Monolithic Obelisks", 130, 3.25),Stock("Fleep Enterprises", 60, 6.5)};// 显示所有股票cout << "Stock holdings:\n";for (int i = 0; i < STKS; ++i)cout << stocks[i];// 找出总值最大的股票const Stock* top = &stocks[0];for (int i = 1; i < STKS; ++i)top = &top->topval(stocks[i]);cout << "\nMost valuable holding:\n";cout << *top << endl;return 0;
}

Stock.cpp方法定义文件

// 头文件
#include "Stock.h"
#include <cstring>// using 声明
using std::cout;
using std::endl;Stock::Stock()  // 默认构造函数
{company = nullptr;shares = 0;share_val = 0;set_tot();
}Stock::Stock(const char* co, int n, double pr)
{// 申请空间,拷贝公司名称int len = (int)strlen(co);company = new char[len + 1];strcpy(company, co);// 赋值其他成员shares = n;share_val = pr;set_tot();
}Stock::~Stock()  // 析构函数
{// 释放申请空间if (company != nullptr)delete[]company;
}void Stock::buy(int num, double pr)  // 买进
{if (num > 0){shares += num;share_val = pr;set_tot();}else{cout << "买进股票的数量不能为负";}
}void Stock::sell(int num, double pr)  // 卖出
{if (num < 0){cout << "卖出股票的数量不能为负";}else if (num > shares){cout << "卖出股票的数量不能超过自身拥有的股票数量";}else{shares -= num;share_val = pr;set_tot();}
}void Stock::update(double pr)  // 更新价格
{share_val = pr;
}// 运算符(<<)重载
std::ostream& operator<<(std::ostream& os, const Stock& s)
{os << "Company: " << s.company;os << " Shares: " << s.shares << endl;os << "  Share Price: $" << s.share_val;os << " Total Worth: $" << s.total_val << endl;return os;
}const Stock& Stock::topval(const Stock& s) const  // 返回总值大的对象
{if (total_val > s.total_val)return *this;elsereturn s;
}

4. 请看程序清单10.10定义的Stack类的变量。

#pragma once// 头文件
#include <iostream>// 类型声明
typedef unsigned long Item;// Stack 类声明
class Stack
{
private:enum { MAX = 10 };Item* pitems;int size;int top;
public:Stack(int n = MAX);Stack(const Stack& st);~Stack();bool isempty() const;bool isfull() const;bool push(const Item& item);bool pop(Item& item);Stack& operator=(const Stack& st);void get_info() const;
};

正如私有成员表明的,这个类使用动态分配的数组来保存栈中的项。请重新编写方法,以适应这种新的表示方法,并编写一个程序来演示所有的方法,包括复制构造函数和赋值运算符。

答:头文件上面有,这里就提供测试文件和方法定义文件。

main4.cpp测试文件

// 头文件
#include "Stack.h"// using 声明
using std::cout;
using std::endl;int main()
{// 默认构造函数Stack stack1;for (int i = 0; i < 5; ++i){stack1.push(i);}stack1.get_info();cout << endl;// 复制构造函数Stack stack2(stack1);stack2.get_info();cout << endl;Item tmp;stack2.pop(tmp);stack2.pop(tmp);stack2.get_info();cout << endl;// 赋值运算符stack1 = stack2;stack1.get_info();return 0;
}

Stack.cpp方法定义文件

// 头文件
#include "Stack.h"// using 声明
using std::cout;
using std::endl;Stack::Stack(int n)
{if (n > MAX){size = MAX;}else if (n > 0){size = n;}else{cout << "栈的大小不能为非正整数\n";size = top = 0;pitems = nullptr;return;}// 申请空间pitems = new Item[size];top = 0;
}Stack::Stack(const Stack& st)
{size = st.size;// 申请空间pitems = new Item[size];top = st.top;// 复制每个元素for (int i = 0; i < top; ++i)pitems[i] = st.pitems[i];
}Stack::~Stack()
{// 释放空间if (pitems != nullptr)delete pitems;
}bool Stack::isempty() const
{return top == 0;
}bool Stack::isfull() const
{return top == size;
}bool Stack::push(const Item& item)
{if (!isfull()){pitems[top++] = item;return true;}else{return false;}
}bool Stack::pop(Item& item)
{if (!isempty()){item = pitems[--top];return true;}else{return false;}
}Stack& Stack::operator=(const Stack& st)
{if (&st == this){return *this;}else{// 释放之前的空间delete[]pitems;// 申请新的空间size = st.size;pitems = new Item[size];// 赋值内容top = st.top;for (int i = 0; i < top; ++i){pitems[i] = st.pitems[i];}return *this;}
}void Stack::get_info() const
{if (pitems != nullptr){for (int i = 0; i < top; ++i){cout << pitems[i] << " ";}}
}

后面两题的答案作者没写,因为目前不是很懂,这些编程练习的答案都是我自己写的,然后运行验证的。作者今天就不加班了,偷个懒,明天早上把这两道题补上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1053510.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么选择CleanMyMac软件呢?推荐理由

你是否曾经遇到过这样的问题&#xff1a;电脑运行缓慢&#xff0c;存储空间不足&#xff0c;不知道如何清理垃圾文件&#xff1f;别担心&#xff0c;我们为你找到了解决方案——CleanMyMac软件。这款强大的工具可以帮助你轻松解决这些问题&#xff0c;让你的电脑焕然一新&#…

MM模块六(收货)

接到供应商收到的货以后&#xff0c;进行一个收货的动作 收货&#xff1a;MIGO 1.消耗物料的采购订单 数量是供应商的数量 消耗物料的采购订单&#xff0c;收进来的货物直接进入消耗&#xff0c;不会增加库存&#xff0c;所以这里没有库存地点进行选择 点击过账 收货后在采购…

【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理&#xff0c;以及遇到的困难和总结 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 什么是搜索引…

前后端开发入门全攻略:零基础学起

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、前后端开发概览 二、后端开发基础&#xff1a;Flask框架入门 代码案例&#xff1a;Hel…

springboot项目,@Test写法 @Before @After

某文件示例 package cn.xxx.crm.boss;import cn.xxxx.crm.manager.mq.rabbit.AliyunCredentialsProvider; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; im…

Spring - Spring Cache 缓存注解这样用,实在是太香了!

作者最近在开发公司项目时使用到 Redis 缓存&#xff0c;并在翻看前人代码时&#xff0c;看到了一种关于 Cacheable 注解的自定义缓存有效期的解决方案&#xff0c;感觉比较实用&#xff0c;因此作者自己拓展完善了一番后分享给各位。 Spring 缓存常规配置 Spring Cache 框架给…

JVM学习-彻底搞懂Java自增++

从字节码角度分析i和i的区别 public void method6() {int i 10;i; //在局部变量表上直接加1}public void method7() {int i 10;i; //字节码同i}public void method8() {int i 10;int a i; //通过下图可以看出先将局部变量表中的值push到操作数栈&#xff0c;然…

音视频安卓主板记录仪手持终端定制开发_基于MT6762平台解决方案

音视频安卓主板采用了基于MT6762高性能处理器芯片的设计&#xff0c;其中包括4个主频高达2.0GHz的Cortex-A53核心和4个主频1.5GHz的Cortex-A53高效聚焦核心&#xff0c;可提供无比流畅的体验。搭载Android 12操作系统&#xff0c;系统版本进行了全新的优化&#xff0c;进一步确…

三十、openlayers官网示例解析Double click, Drag and Zoom——第二次点击鼠标拖拽缩放地图效果、取消地图双击放大事件

这篇展示了如何在地图上添加第二次按下鼠标移动鼠标实现拖拽缩放地图效果。 官网demo地址&#xff1a; Double click, Drag and Zoom 官网介绍文字的翻译如下&#xff1a; 示例比较简单&#xff0c;直接贴代码&#xff1a; const map new Map({//添加第二次点击拖拽缩放地图i…

这样问问题, 客户才会下单!

和供应商沟通时&#xff0c;提问方式至关重要。如何提问是外贸交流的关键&#xff0c;而针对客户的合适提问更是促成交易的秘诀。前不久&#xff0c; 我有一个客户想要一个不属于我们行业的新品&#xff0c; 于是我准备去阿里巴巴找找供应商。但因为我对该领域并不了解&#xf…

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…

redis核心面试题一(架构原理+RDB+AOF)

文章目录 0. redis与mysql区别1. redis是单线程架构还是多线程架构2. redis单线程为什么这么快3. redis过期key删除策略4. redis主从复制架构原理5. redis哨兵模式架构原理6. redis高可用集群架构原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…

v-rep---script-function

作用&#xff0c;实现&#xff0c;参数讲解。 script-function标签 作用 问题&#xff1a;如何在插件的接口中调用lua脚本中定义的函数&#xff1f; 用于声明一个函数&#xff0c;这个函数的作用是通过v-rep提供的接口sim::callScriptFunctionEx()调用脚本的函数&#xff0…

系统开发与运行知识

系统开发与运行知识 导航 文章目录 系统开发与运行知识导航一、软件工程二、软件生命周期三、开发模型四、开发方法五、需求分析结构化分析 六、数据流图分层数据流图的画法设计注意事项 七、数据字典数据字典的内容 八、系统设计九、结构化设计常用工具十、面向对象十一、UML…

【SQL学习进阶】从入门到高级应用(二)

文章目录 简单查询查一个字段查多个字段查所有字段查询时字段可参与数学运算查询时字段可起别名as关键字省略as关键字别名中有空格别名中有中文 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xf…

2024年4月—马克思主义基本原理概论真题及答案解析(上海自考)

目录 1.选择题 2.简答题 3.论述题 1.选择题 2.简答题

7.Redis之String编码方式应用场景业务

1.内部编码 字符串类型的内部编码有 3 种&#xff1a; • int&#xff1a;8 个字节&#xff08;64位&#xff09;的⻓整型。 • embstr&#xff1a;⼩于等于 39 个字节的字符串。压缩字符串.适用于表示比较短的字符串。 • raw&#xff1a;⼤于 39 个字节的字符串。普通字…

【软件工程】【23.04】p1

关键字&#xff1a; 软件模型、提炼、加工表达工具、通信内聚、访问依赖、边界类交互分析、RUP核心工作流、首先测试数据流、软件验证过程、CMMI过程域分类工程类&#xff1b; 软件工程目的、功能需求是需求的主体、结构化方法、耦合、详细设计工具、类、类图、RUP采用用例技…

三十一、openlayers官网示例Draw Features解析——在地图上自定义绘制点、线、多边形、圆形并获取图形数据

官网demo地址&#xff1a; Draw Features 先初始化地图&#xff0c;准备一个空的矢量图层&#xff0c;用于显示绘制的图形。 initLayers() {const raster new TileLayer({source: new XYZ({url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/…

软件性能测试有哪些测试类型和方法?

软件性能测试是一种通过模拟真实用户使用情况&#xff0c;评估软件系统在各种压力和负载下的表现的测试方法。在今天这个讲究效率的时代&#xff0c;软件性能测试是不可或缺的一环。它能帮助开发人员和企业发现潜在的性能问题&#xff0c;提前优化改进&#xff0c;保证软件系统…